次のように 2 つの管理対象オブジェクト コンテキストが設定されたアプリがあります。
- 親コンテキスト: 永続ストアにリンクされた NSPrivateQueueConcurrencyType。
- メイン コンテキスト: NSMainQueueConcurrencyType、親コンテキストの子。
メイン コンテキストに新しい管理対象オブジェクトを挿入するときは、メイン コンテキストを保存し、次に親コンテキストを次のように保存します。
[context performBlockAndWait:^{
NSError * error = nil;
if (![context save: &error]) {
NSLog(@"Core Data save error %@, %@", error, [error userInfo]);
}
}];
[parentContext performBlock:^{
NSError *error = nil;
BOOL result = [parentContext save: &error];
if ( ! result ) {
NSLog( @"Core Data save error in parent context %@, %@", error, [error userInfo] );
}
}];
私の理解では、管理オブジェクトが最初に作成されると、一時的な が存在しますobjectID
。次に、メイン コンテキストが保存され、このオブジェクトは一時的な ID とともに親コンテキストに渡されます。次に、親コンテキストが保存されます。この最後のコンテキストが保存されると、objectID
親コンテキスト内の一時的な が永続的な に変換されますobjectID
。
それで:
- 永続オブジェクト ID は、メイン (子) コンテキストに自動的に伝播されることがありますか?
- でオブジェクトの永続IDを強制的に取得し
[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
、アプリをバックグラウンドで再起動してリロードし、メインコンテキストの でオブジェクトを取得しobjectWithID:
、プロパティにアクセスすると、「CoreData は ... の障害を解決できませんでした」。
ベストアンサー1
これは既知のバグであり、すぐに修正されることが期待されますが、一般的には、最初の子にデータを保存する前に永続 ID を取得し、挿入されたオブジェクトのみを含める限り、永続 ID を取得すれば十分です。
[moc obtainPermanentIDsForObjects:moc.insertedObjects.allObjects error:&error]
複雑なケースでは、特に複雑な関係がある場合、インスタンスを作成したらすぐに永続 ID を取得する方が適切です。
いつ、どのように電話しますかobtainPermanentIDsForObjects
?
アプリがクラッシュするという部分がわかりません。もっと良い説明があれば助かります。