次のインターフェースを持つ NSManagedObject があります。
@class Organization, Person;
@interface Assistance : NSManagedObject
@property (nonatomic, retain) NSDate * date;
@property (nonatomic, retain) Organization *organization; // Not optional, 1 to 1
@property (nonatomic, retain) NSSet *persons; // 1 to many
@end
Person は Organization と 1 対 1 の関係にあります。Assistance は、Organizationと1 対 1 の関係を持ち、Person と 1 - May の関係を持ちます。
初めてエントリを保存しようとしたときは完全に機能しましたが、2 回目はうまくいきませんでした。
ケース シナリオ: 日付が 2013-07-26 00:00:00 +0000 のエンティティ、それぞれの組織と個人を追加します。
アプリを再起動します。現在の日付 (7/27) を検索しますが、何も見つかりません。アプリで編集を開始すると、MagicalRecord の便利なメソッド [Assistance createEntity] で新しいエンティティが作成されます。すぐに日付(7/27)と組織を設定しました。Person オブジェクトが追加または削除されます。別の日付が選択されると、現在のアシスタンス オブジェクト エンティティを保存しようとします。このために、setCurrentDate メソッドを自分で実装しました。
- (void)setCurrentDate:(NSDate *)currentDate
{
if (assistanceWasChanged) {
NSLog(@"> > > Has changed, need to save with Persons {%i}, org {%@}, date {%@}", [self.assistance.persons count], self.organization.name, self.currentDate);
// [[NSManagedObjectContext defaultContext] saveOnlySelfWithCompletion:^(BOOL success, NSError *error) { NSLog(@"> > > 01:Assistance saved?"); }];
[[NSManagedObjectContext defaultContext] saveOnlySelfAndWait];
}
assistanceWasChanged = NO;
_currentDate = currentDate;
[self setCurrentAssistance]; // Tries to find Assistance with new date
}
しかし、今回は保存されません。Cocoa エラー 1570 が表示されます (すべての必須フィールドが入力されていません)。
> > > Has changed, need to save with Persons {1}, org {MSF}, date {2013-07-27 00:00:00 +0000}
2013-07-27 20:23:41.017 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Saving <NSManagedObjectContext (0x8d61e50): *** DEFAULT ***> on *** MAIN THREAD ***
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Parents? 0
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalSaves) MR_saveWithOptions:completion:](0x8d61e50) → Save Synchronously? 1
2013-07-27 20:23:41.018 -[NSManagedObjectContext(MagicalRecord) MR_contextWillSave:](0x8d61e50) Context DEFAULT is about to save. Obtaining permanent IDs for new 1 inserted objects
2013-07-27 20:23:41.019 CoreData: sql: BEGIN EXCLUSIVE
2013-07-27 20:23:41.019 CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ?
2013-07-27 20:23:41.020 CoreData: sql: COMMIT
2013-07-27 20:23:41.021 +[MagicalRecord(ErrorHandling) defaultErrorHandler:](0x6b3a0) Error: <Assistance: 0x9cb16c0> (entity: Assistance; id: 0x9e5ac00 <x-coredata://15A3-4C6D-4025-9131-3D51048/Assistance/p1> ; data: {
date = "2013-07-26 00:00:00 +0000";
organization = nil;
persons = "<relationship fault: 0x8d80500 'persons'>";
})
組織がゼロになることは決してありません。また、日付が「2013-07-26」のオブジェクトは取得/編集されませんでした。ログステートメントが示すように、追加しようとしている新しいオブジェクトの日付は「2013-07-27」です。最初は CoreData が古いデータへのポインタを持っていると思っていましたが、そうではなく、最初に挿入された日付は取得されませんでした。(アプリを再起動すると、最初のオブジェクト (7/26) はまだそこにあります。違いが生じる場合に備えて、Assistance エンティティ オブジェクトは実装ファイルのプロパティです。
@property (strong, nonatomic) Assistance *assistance;
Core Data について何か不足していますか? 新しいエンティティ オブジェクトを保存するときに、最初に挿入されたオブジェクトがアクセスされるのはなぜですか? そして、なぜ組織はゼロなのですか?