2010-01-23 6 views
15

Ich habe ein Kerndatenmodell mit drei Entitäten: A, B und C. A hat eine Eins-zu-viele-Beziehung mit B und B hat eine Viele-zu-Viele-Beziehung mit C. Die Löschregel für A -> B ist "Cascade" und B -> A ist "No Action". Die Löschregel für B -> C ist "No Action" und C -> B ist "Deny".Wie kann man verwaltete Objekte in Core Data ordnungsgemäß kaskadieren?

Ich habe Probleme beim Ausführen eines Löschens auf der A-Entität. Was ich will, geschehen ist folgende:

  1. ich eine Instanz von A (mit deleteObject:)
  2. Die Lösch pflanzt sich in jedem B löschen mit A verbunden sind (aufgrund der „Cascade“ löschen Regel)
  3. alle B mit A verbunden sind
  4. Irgendwelche Beziehungen gelöscht C Zugehörigkeit, deren zugehörige B gelöscht wurden, werden entfernt, auch

das ist ein wenig verwirrend sein mag, so lassen Sie mich paraphrasieren: Wenn ein A dele ist ted, lösche alle zugehörigen B's. Und jedes C, das auf diese B verweist, darf sie nicht mehr referenzieren.

In meinen Tests sehe ich nicht, dass die Löschregel "Cascade" überhaupt für mich funktioniert. Wenn ich ein A lösche, rufe ich sofort danach processPendingChanges auf (nur um sicherzustellen, dass der Löschvorgang durchgeführt wurde). Dann vergleiche ich die Anzahl von A und B, die vor dem Löschen im NSManagedObjectContext waren, und danach. Die Instanz von A wurde ordnungsgemäß gelöscht (die Anzahl der gesamten A ist jetzt um eins niedriger als vor dem Löschen). Die Anzahl der B bleibt jedoch gleich. Es scheint also, dass die Löschregel "Cascade" nicht eingehalten wird.

Ich weiß, dass ich manuell die A -> B-Beziehung durchlaufen kann, und jedes B manuell löschen. Es scheint jedoch, dass dies etwas ist, das Core Data kostenlos zur Verfügung stellt, also möchte ich das nicht ohne Core Data machen ist ungenügend. Alle Informationen bezüglich der Verwendung von "Cascade" Löschregeln sind willkommen.

+0

Warum Sie nicht löschen möchten, die Cs, die auf B verweisen, die mit gelöschtem A verknüpft sind? – Eimantas

Antwort

16

Ich bin sicher kein Core Data-Experte, aber die documentation on the various delete rule options lesen, scheint es mir, dass Sie das B wollen -> C Beziehung Nullify statt Keine Aktion sein. Vielleicht gehen die Bs nicht weg, weil die Cs immer noch Referenzen auf sie haben?

+0

Sie haben mir geholfen, in die richtige Richtung zu weisen. Nullify entfernt die Referenzen korrekt. Ich habe immer noch einige Probleme nach der Löschung, aber ich glaube, es ist etwas in meinem Logik-/Datenmodell. –

+0

Hallo, Link ist kaputt. –

+0

Der Core Data Programming Guide hat vor kurzem einige signifikante Änderungen erfahren (und leider auch viele Inhalte verloren). Der Link wurde aktualisiert. –

1

auf die alle Beziehungen, die zu C ist, deren zugehörige B gelöscht wurden

Basierend werden auch entfernt schlägt vor, dass die B-C auch Cascade haben sollte.

Weiter, wenn B entfernt wird, sollten C auch gelöscht werden. Wieder Cascade.

  • Nullify wird oft als eine inverse Löschregel verwendet *

dh. Bs Beziehung zu A ist Nullify. C-Beziehung zu B ist Nulllify. Wenn C gelöscht wird, wird B NICHT gelöscht. Und wenn B gelöscht wird; A wird NICHT gelöscht.

Wie in dieser gewinnenden Zeichnung.

A --- >> B Cascade < ---- Nullify

B --- >> C Cascade < ---- werden aufgehoben