Core Data と Objective-C は初めてです。Web サービスから JSON データを取得し、それをコア データと同期するプロジェクトに取り組んでいます。私はこのチュートリアルに成功し、問題なく JSON をコア データに取り込むことができました。私が問題を抱えているのは、対多関係に関連付けられた NSSet の更新です。これまでのところ、更新することはできますが、そうすると、セット内に重複するエントリが作成されます。たとえば、カスタム ManagedObject Entity1 で Xcode によって生成されたアクセス メソッドを使用してみました。
Entity1<-->>Entity2<-->>Entity3
このコードを使用して、Entity2 オブジェクトを Entity1 に追加します。
NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
Entity1 *parentEntity = [parentEntityArray lastObject];
[parentEntity addEntity2Object:(Entity2 *)newManagedObject];
実行時に各変数を確認した後、最後の行まですべてが正しく機能していることを確認しました。Entity2 を Entity1 に追加すると、実際にはオブジェクトが追加されます。ただし、3 つの異なる Entity2 オブジェクトを追加しようとすると、Entity1 に 3 つの重複した Entity2 オブジェクトが作成されたように見えます。3 つの重複は、追加された Entity2 の最後のインスタンスのものです。
また、この回答のアプローチを使用してみました: https://stackoverflow.com/a/5370758/2670912。次のようになります。
NSNumber *parentIdNumber = [record valueForKey:@"parent_id"];
NSArray *parentIdArray = [NSArray arrayWithObject:parentIdNumber];
NSArray *parentEntityArray = [self managedObjectsForClass:@"Entity1" sortedByKey:@"id" usingArrayOfIds:parentIdArray inArrayOfIds:YES];
Entity1 *parentEntity = [parentEntityArray lastObject];
NSMutableSet *entity2Set = [parentEntity mutableSetValueForKey:@"entity2"];
[entity2Set addObject:newManagedObject];
これは、追加された 3 番目のオブジェクトの 3 つの重複エントリを取得する代わりに、追加された最初のオブジェクトの 3 つの重複エントリを取得することを除いて、同じ重複エントリの結果になります。
誰がこれを引き起こしているのか考えていますか?