コアデータを使用すると、複数の永続ストアを単一のNSPersistentStoreCoordinator
(それぞれ異なる構成を持つ)名に追加することができ、それらをまとめて単一のNSManagedObjectContext
にできます。私が見つけられなかったのは、コアデータが複数のストアのセーブ操作のアトミック性をどのように処理するかです。複数のストアを持つコアデータストアアトミック性
のは、私は2つの店舗を持っているとしましょう:
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] init];
[coordinator addPersistentStoreWithType:type configuration:@"A" URL:aURL options:nil error:NULL];
[coordinator addPersistentStoreWithType:type configuration:@"B" URL:bURL options:nil error:NULL];
NSManagedObjectContext *context = [[NSManageObjectContext alloc] init];
[context setPersistentStoreCoordinator:coordinator];
そしてそれは私が保存する時間です:ドキュメントは、イベントのシーケンスが可能になると述べて
NSError *error = nil;
BOOL result = [context save:&error];
:
- ストアA
- ストアB
ストアAが正しく保存されても、ストアBが何らかの理由で保存できない場合はどうなりますか?(たとえば、ディスク上のファイルが削除されたか、アクセス許可が読み取り専用になっているなど)。コアデータがストアAへの変更をロールバックするかどうかを詳しく説明するドキュメントは見つかりません。
オブジェクトグラフが矛盾した状態(つまり、1つのストアが更新されている、1つは更新されていない)複数の店舗にまたがって完全なアトミック・セービングを実行するには、多少トリッキーでリソースが集中します。おそらく、おそらくシステムのより多くの経験を持つ誰かから、ここにいくつかの明確化がほしいと思うでしょうか?
私はこれをまだ試していません。実験結果が文書化された行動であると考えることに幾分注意が払われています。行動の変化は私が計画しているものにかなり致命的なものになるためです。 私は、私が検索で出せなかった問題について、誰かが私にドキュメントのスクラップを指し示すことができるかもしれないことを期待していました。 –
まあ、ドキュメントは見つかりません。私は最悪の場合のシナリオを計画し、ロールバックは2つのデータストアではうまくいかず、コードが何らかの方法でこれを処理できることを確認します。大きなトランザクションを開始する前に、ダミーテーブルへの挿入を試みて、ストアの状態が正常であることを確認することができます。 – Grouchal
@Grouchal - あなたが提案しているテストがうまくいくかどうかはわかりません。デフォルトでは、CoreDataは必要に応じて2番目のストアを作成します(提案したとおりにファイルが閉じられた場合)。ファイルが開いていれば、unixファイルシステムはファイルシステムからファイルをリンク解除しますが、CoreDataスタックはクローズされるまでリンクされていないファイルにアクセスできます。 – xyzzycoder