Core Data でネストされた管理対象オブジェクト コンテキストを使用するときに発生する問題の適切な解決策を見つけようと奮闘しています。Person と Name の 2 つのエンティティを持つモデルを考えてみましょう。各 Person は Name と 1 対 1 の関係にあり、Name の person 関係はオプションではありません。以前は、Person の-awakeFromInsert
メソッドで、新しい Person の Name エンティティを自動的に作成していました。
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
これは、ネストされていない単一の管理対象オブジェクト コンテキストで問題なく機能します。ただし、コンテキストに親コンテキストがある場合、子コンテキストが保存されると、新しい Person オブジェクトが親コンテキストで作成され、元の Person のプロパティと関係がコピーされる前に-awakeFromInsert
、この新しいオブジェクトで再度呼び出されます。そのため、別の Name オブジェクトが作成され、既存の名前の関係がコピーされると「切断」されます。フローティング Name の now-nil関係の検証が失敗するため、保存は失敗します。この問題は、ここと他の場所で説明されています。person
これまでのところ、この問題に対する適切な解決策を思い付くことができませんでした。getter メソッドでリレーションシップを遅延作成すると、実際には同じ問題が発生します。これは、新しい Person が親コンテキストで作成されるときに、内部 Core Data 機構によって getter が呼び出されるためです。
私が思いつくことができる唯一のことは、自動関係生成を放棄し、Person を作成するコントローラー クラス、または+[Person insertNewPersonInManagedObjectContext:]
私のコードによってのみ呼び出され、常に新しい Person オブジェクトを明示的に作成するために使用されるメソッド。おそらくこれが最善の解決策ですが、管理対象オブジェクトの作成に単一のメソッドのみを使用できるようにすることについて、それほど厳密にする必要はありません。簡単にチェック/除外、存在します。1 つには、複数の NSArrayController サブクラスが、管理対象オブジェクトの作成方法をカスタマイズすることを意味します。
この問題に遭遇した他の誰かが、1 つの NSManagedObject が作成/挿入時に関係オブジェクトを自動的に作成できるようにする洗練されたソリューションを思いつきましたか?