2011-08-22 11 views
27

を削除します。Coredataは、私はこのような2つのエンティティ間のコアデータの関係を、持っているルールの混乱、Xcodeの

たぶん私はこの間違ったを持っていますが、私はこれらの関係の両方のための削除規則が「カスケード」に設定されていた場合と考え、次なかったとき...

[context deleteObject:EntityA]; 

...それはですそれに関連付けられているエンティティBのすべてを削除します。しかし、私がエンティティBのすべてを記録すると、間違っているように見えます。

誰かが私の混乱を晴らすことができますか?

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

答えて

90

それはグラフィカルなデータモデルエディタで、すぐに明らかではないですが、各recipocal関係すなわち、各

<--> 

は...本当に、自身のDELETを持つ2つの独立した関係各ですeルール。削除ルールを持つエンティティのオブジェクトが削除されると、削除ルールがアクティブになります。だから、

、データモデルエディタであなたが関係を持つ2つのエンティティAlphaBeta持っている場合:

Alpha.betas<-->>Beta.alpha 

を...そしてあなたが本当にそうのような2体の関係を持っている:

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

あなた決してこのような削除ルールを設定したい:

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

...いずれかのBetaインスタンスを削除すると、すべての関連するBetaオブジェクトの削除をトリガーする関連するAlphaオブジェクトが削除されるためです。データモデルの詳細によっては、相互にカスケードすると、偶然大きなデータが削除される可能性があります。あなたが本当に欲しい

は次のとおりです。

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

、あなたがAlphaオブジェクトを削除するとき、それはすべての関連するBetaオブジェクトを削除します。

カスケードがブロックされている場合は、通常、必要な関係に問題があります。データモデルの詳細なしではっきりと伝えることはできません。

+0

簡単な質問ですが、 '[context deleteObject:EntityA];を実行すると、最後のスナップショットのようにすべてのベータ版が正しく削除されます。 –

+0

削除をブロックするものがないと仮定します。 – TechZen

+0

しかし、すべてのベータ版を削除するとどうなりますか?そのような場合にAlphaを自動的に削除する方法は? – shoumikhin

3

どの削除ルールを使用しているかによって異なります。ここで

は、Appleがその文書に言っている:

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

のリンク 『の関係の削除ルール』:。。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1

関連する問題