を使用するこの Mac アプリケーションがありますcoredata。というエンティティがありOfferedClasses、1 つは と呼ばれ、もう 1 つはPupilsと呼ばれProfessorsます。
classesエンティティには、他の各エンティティとの関係があります。professor1 つまたは複数のを持つことができますpupils。
各エンティティには、クラスを展開するクラス表現がありNSManagedObjectます。
窓も二つあります。1 つはエンティティによって所有され、行を作成するオプションを含むエンティティAppDelegateのリストを持ち、もう 1 つは行を削除するオプションを持っています。classesclasses
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を使用し、 modeset toEntity NameとEntity Nameset to ProfessorswithPrepares ContentとEditableticked を使用します。
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はヌルです!
ありがとう!