[Core Data] Löschen eines NSManagedObjects

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Core Data] Löschen eines NSManagedObjects

    Hallo zusammen,

    ich bin leider durch die (Apple- & ein CD-Buch "Pragmatic Programmers") Doku etwas verwirrt und hoffe ein wenig Klarheit zu bekommen.

    Ich habe mehrere Entities mit teilweise transienten Properties, die ich beim Löschen selbst frei geben muss. Außerdem möchte ich gerne sichergehen, dass die Objekte auch wirklich gelöscht werden - also auch meine Entities selbst.
    In der Doku wird darauf verwiesen, dass man statt -dealloc die -willTurnIntoFault bzw. -didTurnIntoFault überschreibt. Diese werden auch aufgerufen sofern ich meine CD-Entity davor selbst erzeugt habe.
    Wenn ich diese im Gegenzug aus einem von Core Data generierten XML-File oder binary lade und dann lösche wird keine der Funktionen aufgerufen. Auch in einem ganz einfachen Dummy-Projekt.

    Hat jemand eine Idee? Die Entites werden von einem Array Controller erzeugt, der an den managedObjectContext gekoppelt ist.

    Danke und Gruß
  • Hallo Kraftwerk,

    vielleicht bin ich der Falsche oder verstehe Dein Problem nicht richtig. Du wirst irgendeine Methode zum Löschen aufrufen müssen. Ein Object mit alle seinen Entities zu löschen geht ganz einfach:

    Quellcode

    1. [deinContext deleteObject:deinObjekt];


    Gruß
    iet
    ----
    Macht's gut und danke für den Fisch
  • ichessetoast schrieb:

    Hallo Kraftwerk,

    vielleicht bin ich der Falsche oder verstehe Dein Problem nicht richtig. Du wirst irgendeine Methode zum Löschen aufrufen müssen. Ein Object mit alle seinen Entities zu löschen geht ganz einfach:

    Quellcode

    1. [deinContext deleteObject:deinObjekt];


    Gruß
    iet


    Das (Core Data-) Objekt lösche ich über den Array Controller (removeObject). Dieser zieht es aus dem managedObjectContext raus. Es funktioniert auch, allerdings nur wenn ich es zur Laufzeit erzeugt habe und nicht vorher aus einem Store geöffnet habe. Dann wird die -didTurnIntoFault nicht mehr aufgerufen. Schicke ich ein manuelles deleteObject an den managedObjectContext passiert das gleiche.
  • Also eigentlich hast Du ja Deinen Context schon vorher gefüllt. Also Objekte in Form von Daten in ein Array geschrieben.
    Mit removeObject entfernst Du nur Daten aus dem Array, nicht aber das Objekt aus dem Context. Dafür musst Du deleteObject: vor bzw. anstatt des removeObject: aufrufen. Mir ist die -didTurnIntoFault aber auch noch nie untergekommen bzw. ich brauchte die nie aufrufen.

    Hoffe das hilft Dir mehr, sonst ziehe ich mich mal vornehm aus Deiner Frage zurück und hoffe auf die Hilfe der Anderen :)
    ----
    Macht's gut und danke für den Fisch
  • You use this method to clear out custom data caches—transient values declared as entity properties are typically already cleared out by the time this method is invoked (see, for example, refreshObject:mergeChanges:).

    Insgesamt klingt es für mich so, als würden deine Objekte nach dem Laden aus dem Store nicht komplett initialisiert.
    Da sie den 'fault'-State nicht verlassen, besteht auch keine Notwendigkeit in den 'fault'-State zu wechseln, was ja durch die -*TurnIntoFault: Methoden mitgeteilt wird.

    Transient properties are properties that you define as part of the model, but which are not saved to the persistent store as part of an entity instance's data. Core Data does track changes you make to transient properties, so they are recorded for undo operations.

    Das bedeutet, dass Deine transienten Properties ja niemals gespeichert werden, dementsprechend kannst Du sie auch überhaupt nicht laden und Dich auf die -*TurnIntoFault: Methoden zu verlassen ist demnach sinnlos.
    Entsprechend kannst Du auch keine transienten Properties aus dem ManagedObjectContext werfen – sie stehen ja gar nicht drin.

    Ein paar Tipps zu den Transient Properties:
    2pi.dk/tech/cocoa/transient_properties.html
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Danke für die ausführliche Antwort.

    Insgesamt klingt es für mich so, als würden deine Objekte nach dem Laden aus dem Store nicht komplett initialisiert.
    Da sie den 'fault'-State nicht verlassen, besteht auch keine Notwendigkeit in den 'fault'-State zu wechseln, was ja durch die -*TurnIntoFault: Methoden mitgeteilt wird.


    Das war auch meine erste Vermutung, initialisiert werden sie beim normalen insert und nach dem Laden über die

    Quellcode

    1. - (id)initWithEntity:(NSEntityDescription *)entity insertIntoManagedObjectContext:(NSManagedObjectContext *)context.

    Die Objekte und Properties sind aber definitiv im Hauptspeicher.

    Das bedeutet, dass Deine transienten Properties ja niemals gespeichert werden, dementsprechend kannst Du sie auch überhaupt nicht laden und Dich auf die -*TurnIntoFault: Methoden zu verlassen ist demnach sinnlos.
    Entsprechend kannst Du auch keine transienten Properties aus dem ManagedObjectContext werfen – sie stehen ja gar nicht drin.


    Da hab ich mich vielleicht zu ungenau ausgedrückt. Die transienten Properties lade ich nicht, diese werden separat initialisiert in der - (id)initWithEntity..
    Deshalb muss ich sie eigenhändig löschen wenn mein NSManagedObject aus dem Hauptspeicher verschwindet, sonst gibt es leaks oder?
  • OK ich versuche die Frage mal einfacher zu stellen:

    1. Erzeuge und lösche ich ein NSManagedObject wird die -didTurnIntoFault aufgerufen.
    2. Lade und lösche ich ein NSManagedObject wird die -didTurnIntoFault NICHT aufgerufen (Objekt ist zu diesem Zeitpunkt nicht "fault")

    Wieso? Wo muss ich die transient properties frei geben?
    In der Doku steht explizit man soll bei einem NSManagedObject die -dealloc nicht überschreiben.