を使用するこの Mac アプリケーションがありますcoredata
。というエンティティがありOfferedClasses
、1 つは と呼ばれ、もう 1 つはPupils
と呼ばれProfessors
ます。
classes
エンティティには、他の各エンティティとの関係があります。professor
1 つまたは複数のを持つことができますpupils
。
各エンティティには、クラスを展開するクラス表現がありNSManagedObject
ます。
窓も二つあります。1 つはエンティティによって所有され、行を作成するオプションを含むエンティティAppDelegate
のリストを持ち、もう 1 つは行を削除するオプションを持っています。classes
classes
2 番目のウィンドウは、私が呼び出すクラスによって所有されますPeopleManager
。そこには 2 つのタブがあり、1 つは のリスト、professors
もう 1 つは のリストですpupils
。このウィンドウでは、行を追加および削除するための同じツールを使用できます。
アプリケーションをテストしているときに、次の一連のアクションによって引き起こされる奇妙な動作に遭遇しました。
- 両方のウィンドウを開きます (
app delegate
クラスをpeople
管理するためと人を管理するため)。 - 新しい
class
行を作成します (この時点では生徒と教授は nil です)。 - 新しい行を削除し
class
ます (間違っているとします)。 - に移動し
people manager
ます。 - ランダムな
professor
行を 1 つ削除します。
次のエラーでアプリケーションがクラッシュします。
2013-10-04 09:37:40.286 Application[415:903] Serious application error. Exception was caught during Core Data change processing: CoreData could not fulfill a fault for '0x10188f020 <x-coredata://89D3EA2E-DF58-4995-8FEA-BD1D237F1B28/OfferedClasses/p45>' with userInfo {
NSAffectedObjectsErrorKey = (
"<OfferedClassesEntityModel: 0x10188a260> (entity: OfferedClasses; id: 0x10188f020 <x-coredata://89D3EA2E-DF58-4995-8FEA-BD1D237F1B28/OfferedClasses/p45> ; data: <fault>)"
);
}
managed object context
さて、このメッセージをインターネットで検索しているときに(私もstackoverflowを検索しました)、私はどういうわけか台無しになっているという概念に出くわしました。ただし、ほとんどの例は、複数のスレッドを持つアプリケーションにあるようで、両方のオブジェクト コンテキストが同期されていません。多くの場合、grand central dispatch
問題などがあります。私のものは単純なウィンドウ コントローラーであり、ここでは別のオブジェクト コンテキストを使用しようとはしません。私は要約しようとします:
私の AppDelegate には、次のプロパティがあります。
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator * persistentStoreCoordinator;
@property (readonly, strong, nonatomic) NSManagedObjectModel * managedObjectModel;
@property (readonly, strong, nonatomic) NSManagedObjectContext * managedObjectContext;
...そして、次のメソッドを手動で実装します。
- (NSManagedObjectModel *)managedObjectModel;
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
- (NSManagedObjectContext *)managedObjectContext;
ウィンドウを開くには、次のpeople manager
コードを使用します。
- (IBAction)showPeopleWindow:(id)sender {
//Gets the Managed Object Context:
NSManagedObjectContext * managedObjectContext = [self managedObjectContext];
if (!peopleWindowController) {
peopleWindowController = [
[PeopleWindowController alloc]
initWithManagedObjectContext: managedObjectContext
];
}
[peopleWindowController showWindow:self];
}
professors
リストはバインディングで処理されます。インターフェイス ビルダーでは教授array controller
用のattributes inspector
を使用し、 mode
set toEntity Name
とEntity Name
set to Professors
withPrepares Content
とEditable
ticked を使用します。
Bindings Inspector
私はにManaged Object Context
設定し、File's Owner
にModel Key Path
設定しましたmanagedObjectContext
。
このバグはPupils
エンティティでは発生せず、行を削除したときにのみ発生しOfferedClasses
ます。
OfferedClassesEntityModel
エラーに記載されているクラスはクラスの 1 つですNSManagedObject
。次のコードがあります。
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class RelationshipClassesPupilsEntityModel, ProfessorEntityModel, PupilEntityModel;
@interface OfferedClassesEntityModel : NSManagedObject
//(...)
@property (nonatomic, retain) NSSet * pupils;
@property (nonatomic, retain) ProfessorEntityModel * professor;
//(...)
@interface OfferedClassesEntityModel (CoreDataGeneratedAccessors)
- (void)addPupilsObject:(RelationshipClassesPupilsEntityModel *)value;
- (void)removePupilsObject:(RelationshipClassesPupilsEntityModel *)value;
- (void)addPupils:(NSSet *)values;
- (void)removePupils:(NSSet *)values;
//(...)
@end
すべてのプロパティは で実装され@dynamic
ます。
これはPeopleWindowController
初期化メソッドです:
- (id)initWithManagedObjectContext:(NSManagedObjectContext *)theManagedObjectContext {
self = [super initWithWindowNibName:@"PeopleWindow"];
if (self) {
managedObjectContext = theManagedObjectContext;
}
return self;
}
助けてください、どこに問題があるのか わかりません。
私はこれを試しました: 「CoreDataが障害を満たせませんでした」を防ぐにはどうすればよいですか?
オブザーバーは正常に機能しますが、MOC を更新するアクションは機能しません。
もう1つ、新しく作成された でのみクラッシュしclasses
ます。class
以前の実行で行を保存した場合、それは正常に機能することを意味します。
また、class
行が作成されるとき、関係は設定されていません。それprofessor
はヌルです!
ありがとう!