Core Data: 子コンテキストは、新しく挿入されたオブジェクトの永続的なオブジェクトIDを取得することがありますか? 質問する

Core Data: 子コンテキストは、新しく挿入されたオブジェクトの永続的なオブジェクトIDを取得することがありますか? 質問する

次のように 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?

アプリがクラッシュするという部分がわかりません。もっと良い説明があれば助かります。

おすすめ記事