1

バッチ (インポート プロセス) で CoreData エンティティにいくつかのデータを作成する必要があり、最後に "コミット" するか、エラー時に "ロールバック" したい (そのため、その間の保存は機能しません)。

問題は、たとえばエンティティ「人」を作成する必要があり、その進行中に後でそのエンティティを再利用する必要があることです。ただし、このプロセスの前にすでに存在している場合もあれば、このインポート プロセス中に作成されている場合もあります。

そこで、「(personId == 4711)」という述語で取得しようとしています。しかし、設定 [fetchRequest setIncludesPendingChanges:YES];しましたが、新しく作成された Person オブジェクトが見つかりません。

私はこの質問この回答を読みましたが、それは不可能ですか? 私は正しいですか?

もしそうなら、どうすればこれを回避/処理できますか?

4

1 に答える 1

1

CoreData について私が知っていることから、これは不可能です (間違っている場合は修正してください)。

ただし、これが可能であったとしても、「オブジェクトごと」にストアを照会することは絶対にしたくありません。
大規模な (数十を超える) インポートのパフォーマンスへの影響は非常に大きくなります。

私の提案は、インポート段階で一意の識別子をキーにした辞書を作成することです (ストアの既存のエンティティからプリフェッチし、そうでないエンティティに対して新しいエンティティを作成します)。

注:マルチスレッド環境で異なるコンテキストから複数の挿入を実行しないように注意する必要があります。そのような場合、重複を防ぐためにコーディネーターが必要になります。

例:

格納内容: 1 --> P1, 3 --> P3
サービス応答: 1 --> Data1, 2 --> Data2

アルゴリズム:
応答の完了時に、応答からすべての一意の ID を取得します --> recievedIds= @[1,2]セット
の作成中recievedIdsに personId のマッピング/辞書を作成します --> データ:
@{1 : Data1, 2 : Data2}

述語によるストアからのフェッチ:
[NSPredicate predicateWithFormat:@"personId IN %@",recievedIds]
結果の配列から辞書を作成します。
この場合: existingItems= @{1 : P1}

次のすべての ID を渡しrecievedIdsます
。1) ID が存在する場合existingItemsは既存のオブジェクトを更新します
。2) そうでない場合は、新しい人を作成し、データを新しいレコードに挿入します。

これはストアから 1 回だけフェッチされます。
そして、あなたは一度だけ保存します。
==> オブジェクトごとの移動ではなく、店舗への移動は 2 回のみ

于 2013-09-18T13:44:45.123 に答える