web-dev-qa-db-ja.com

Coredata削除ルールの混乱、xcode

2つのエンティティ間にコアデータの関係があります。これは次のようになります。

Entity A                        Entity B
aRelationship <-------------->> bRelationship

削除ルールをカスケードに設定します。

これは間違っているかもしれませんが、これらの関係の両方の削除ルールが「カスケード」に設定されている場合、次のことはいつ行われたのでしょうか...

[context deleteObject:EntityA];

...それに関連付けられているエンティティBもすべて削除されます。ただし、エンティティBをすべてログに記録すると、間違っているように見えます。

誰かが私の混乱に光を当ててくれませんか?

どうもありがとうございました。

27
James Dunay

グラフィカルデータモデルエディタではすぐにはわかりませんが、各レシピの関係、つまりそれぞれ

<--> 

...実際には、それぞれ独自の削除ルールを持つ2つの別個の関係です。削除ルールは、削除ルールを持つエンティティのオブジェクトが削除されるとアクティブになります。

したがって、データモデルエディタに2つのエンティティAlphaBetaがあり、関係がある場合:

Alpha.betas<-->>Beta.alpha

…そして、あなたは本当にそのような2つの関係を持っています:

Alpha.betas--(delete rule)-->>Beta.alpha
Beta.alpha--(delete rule)-->Alpha.betas

あなたnever次のような削除ルールを設定したい:

Alpha.betas--(cascade)-->>Beta.alpha
Beta.alpha--(cascade)-->Alpha.betas

…任意の1つのBetaインスタンスを削除すると、関連するAlphaオブジェクトが削除され、関連するすべてのBetaオブジェクトの削除がトリガーされるためです。データモデルの詳細によっては、相互カスケードによってデータの大部分が誤って削除される可能性があります。

あなたが本当に欲しいのは:

Alpha.betas--(cascade)-->>Beta.alpha
Beta.alpha--(nullify)-->Alpha.betas

これで、Alphaオブジェクトを削除すると、関連するすべてのBetaオブジェクトが削除されます。

カスケードがブロックされると、通常、必要な関係に問題が発生します。データモデルの詳細がなければ、はっきりとはわかりません。

90
TechZen

使用している削除ルールによって異なります。

Appleが彼らの文書で言ったことは次のとおりです:

「管理対象オブジェクトを削除するときは、その関係、特に関係に指定された削除ルールを考慮することが重要です。管理対象オブジェクトの関係削除ルールがすべて無効になっている場合、そのオブジェクトについては、少なくとも追加の作業はありません。 (関係の宛先にあった他のオブジェクトを考慮する必要がある場合があります。逆の関係が必須であるか、カーディナリティの下限がある場合、宛先オブジェクトは無効な状態にある可能性があります)。関係が削除された場合ルールがカスケードの場合、1つのオブジェクトを削除すると、他のオブジェクトが削除される可能性があります。ルールが拒否の場合、オブジェクトを削除する前に、関係から宛先オブジェクトを削除する必要があります。そうしないと、保存時に検証エラーが発生します。削除ルールがアクションなしの場合は、オブジェクトグラフの整合性を確保するために必要な手順を実行する必要があります。」

「RelationshipDeleteRules」のリンク: http://developer.Apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//Apple_ref/doc/uid/TP40001857-SW1

3
xuzhe