私が持っているものと欲しいもの:
私は一対多の関係A <--->> Bを持っています(対多の部分は順序付けられています)。
- A を削除する場合、A と関係のあるすべての B も削除する必要があるため、A と B の関係の削除ルールはカスケードに設定されています-> 正常に動作します
- B を削除する場合、A に戻る関係のみをクリアする必要があるため、B と A の関係の削除ルールは無効に設定されます -> 機能しません(遅延後のみ)
問題の説明:
したがって、この質問「Core Data Nullify ルールが機能しませんか?」で述べられているのとまったく同じ問題があります。: A と関係のある B を削除し、その直後に A と関係がある残りの B の数を数えますが、以前と同じです。その質問で受け入れられた答えは、nullify が行うことは次のとおりであるため、nullify の代わりにカスケードを使用することでした。
Nullify は、オブジェクトが削除されると、ポインタを null に設定します。ポインターの配列がある場合、それは削除されず、null に設定されます。
その答えには2つの問題があります:
- この場合、カスケードは間違ったルールであると確信しています。これは、B を削除するときに A も削除するためです。これは私が達成したいことではありません。(それでも試してみたところ、結果は期待どおりでした:Aも削除されました)。
- コレクションは、NSNull シングルトンを使用する場合を除いて、その要素の 1 つとして null を持つことはできません。したがって、これが無効化ルールの機能であるとは思えません。
少し実験した後、B のインスタンスを削除するとすぐに削除されますが、A との関係はすぐには削除されず、少し遅れてのみ削除されることがわかりました。
// Method is called by pressing a button
-(void)removeLastBOfA:(A *)instanceOfA
{
// Prints 4
NSLog(@"fetch all b's count before:%d", [context fetchAllBs].count);
// Prints 4
NSLog(@"A's relation to B count before: %d", instanceOfA.relationToB.count);
[context deleteObject:[instanceOfA.relationToB lastObject]];
// Prints 3
NSLog(@"fetch all b's count after:%d", [context fetchAllBs].count);
// Prints 4, but should be 3. Last Object of A's relationToB is still the object that was deleted
NSLog(@"A's relation to B count after: %d", instanceOfA.relationToB.count);
}
ボタンを押して、その間に何もせずに上記のメソッドを再度呼び出すと、関係が突然更新され、「A と B の関係の前のカウント: 3」が出力されます。そのため、無効化削除ルールは希望どおりに機能しますが、少し遅れます。
質問:
- 私が述べた2つの問題は有効ですか?
- nullify が遅延後にのみリレーションを更新するのはなぜですか? その遅延は何ですか? または、NSManagedObject を削除した後、どの時点で関係が更新されますか?