CoreData + "Garbage Collection"

  • CoreData + "Garbage Collection"

    Hallo,

    wieder ein CoreData Problem. Ich habe ein Model (siehe Screenshot), dessen "Integrität" ich gewährleisten muss.

    Ganz einfache Sache eigentlich: Sobald ein Objekt der Entität "Person" auf kein Objekt der Entität "HausPerson" verweist ist es für mich nutzlos und sollte gelöscht werden. Die 1:1 Beziehungen person - kopf - mund haben die Delete Rule "cascade" - würden also beim Löschen einer Person auch gelöscht werden - das ist fein.

    Die delete Rule der "person" Relationship von "HausPerson" kann ich nicht auf cascade setzen, da eine Person ja in vielen HausPersonen sein kann.

    Muss ich da selbst Hand anlegen oder gibts da eine Möglichkeit für Entitäten bzw. deren Objekte Regeln zu definieren, wann ein Objekt gelöscht werden kann? Also eine Art Garbage Collection.

    [Blockierte Grafik: http://img516.imageshack.us/img516/8493/modeluh5.png]

    Danke.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • HausPerson brauchst Du eigentlich nicht. Die Many-to-Many relationship kannst Du direkt machen.

    Probier mal:
    - Person: Deny
    solange verknüpfungen vorhanden sind, darunter "Haus", kann nix gelöscht werden
    - Haus: Cascade
    Löscht alles, was dran hängt und (s. oben) gelöscht werden darf.

    Muddu probieren.

    No.
  • Er benötigt das so, wie ich zufällig weiß. ;)

    Du kannst ja einfach beim WEgnehmen der Beziehung darauf schauen, ob es noch andere gibt und notfalls "hart" löschen. Was hier fehlt, ist das RC. Ich habe dazu mal einen Request an Apple geschrieben. Es kam zurück "Behaves as intended".

    *Ohne Worte*

    Seitdem denke ich schon länger darüber nach, wie man RC anständig in CoreData unterbekommt. Das ist aber nicht trivial.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Danke erstmal. Ich habe schon sowas befürchtet.

    Ich habe, bevor ich hier diese Frage gestellt habe einen Freund von mir befragt, der recht fit mit solchen "datenmodels" ist, ob es in "seiner Welt" (er ist ein Javaboy) für ein derartiges Problem eine geistreiche Lösung gibt. In Hibernate (1) soll sowas angeblich funktionieren. Daraufhin habe ich dann die gesamte Core Data Dokumentation nochsmals durchforstet aber nichts gefunden. Tja - da muss man dann wohl selbst Hand anlegen...


    de.wikipedia.org/wiki/Hibernate_%28Framework%29
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Juhu es klappt. Wobei ich mir bei der Implementierung nicht wirklich sicher bin...

    Ist das hier richtig - im Groben?

    Quellcode

    1. - (void)removeDeckCardsObject:(EBHDeckCard *)deckCard {
    2. [self willChangeValueForKey:@"deckCards" withSetMutation:NSKeyValueMinusSetMutation usingObjects:[NSSet setWithObject:deckCard]];
    3. NSMutableSet *deckCards = [[self primitiveValueForKey:@"deckCards"] mutableCopy];
    4. [deckCards removeObject:deckCard];
    5. [self setPrimitiveValue:deckCards forKey:@"deckCards"];
    6. [self didChangeValueForKey:@"deckCards" withSetMutation:NSKeyValueMinusSetMutation usingObjects:[NSSet setWithObject:deckCard]];
    7. [deckCards release];
    8. if([[self deckCards] count] > 0) return;
    9. [[[NSApp delegate] managedObjectContext] deleteObject:self];
    10. }
    Alles anzeigen
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].