2012-11-21 16 views
6

In der Dokumentation und in der breiten Literatur der erzeugten Factory-Methode zu entfernen, um zu löschen/entfernen, um eine Unterklasse verwaltete Objekt in Coredata für IOS istLöschen oder Managed in Coredata

(void)removeXXXObject:(NSManagedObject *)value 

wobei XXX die entsprechende Beziehung ist oder wir können benutze einfach removeObject.

In meinem Code habe ich dies:

Data *lastData = [[self sortedPersonDatas] objectAtIndex:0]; 
[selectedPerson removePersonDatasObject:lastData]; 

wo PersonDatas eine Beziehung zu Daten einer Eins-zu-viele ist Objekt verwaltet aus ich die letzten Daten erstellt wurde (lastData resultierte aus einem sortierten Array aller Daten) Aber mit den ersten beiden remove-Methoden und der Überprüfung der SQL-Datenbank hinter finden wir, dass die tatsächlichen Daten vorhanden sind, nur die inverse Beziehung ist null. Um die Daten vollständig (alle Attribute und das Objekt) lösche ich benutzen musste:

[selectedPerson.managedObjectContext deleteObject:lastData]; 

Die Frage: was die bessere Methode ist und ist es richtig, dass Coredata die Daten intakt lässt?

+0

Haben Sie Kontext nach dem Löschvorgang speichern? –

+0

Ja, ich habe den Kontext gespeichert, es ist nicht das Problem. – BootMaker

Antwort

7

removeXXXObject entfernt nur ein Objekt aus einer n-Beziehung, nicht aber das Objekt nicht aus dem Speicher gelöscht werden. Um dies zu tun, muss man in der Tat deleteObject verwenden - das ist das gewünschte Verhalten. Der Aufruf deleteObject wird standardmäßig auch die entsprechenden Beziehungen zu Null gesetzt (siehe https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1).

+0

Danke für die schnelle Antwort, aber ich bin nicht absolut davon überzeugt, dass dieses Verhalten korrekt ist. Wenn Sie die Beziehung (hier: personDatas) von "nullify" auf "cascade" umstellen, muss das Objekt wie in den Apple-Dokumenten gelöscht werden: "Löschen Sie die Objekte am Ziel der Beziehung." Aber wie ich es versucht, die „removeXXXObject“ mit Kaskade Regel löschen das Objekt nicht zunichte machen nur die Beziehung, die störend ist als die nullify Regel das gleiche tut. Seltsam. – BootMaker

+2

@BootMaker: „Regel löschen: Cascade“ bedeutet: Wenn eine „Person“ Objekt gelöscht wird, dann alle zugehörigen „Data“ Objekte werden ebenfalls gelöscht. Es bedeutet nicht: Wenn ein "Daten" -Objekt von der verwandten "Person" entfernt wird, wird es gelöscht. - Also die "Delete Rule" spezifiziert: "Was passiert, wenn dieses Objekt gelöscht wird?" –

+0

@Martin R: Was Sie gesagt haben, ist, was ich früher über Kaskadenregel dachte, aber was die Apple Docs sagt, ist anders, das Zielobjekt der Beziehung ist die Daten. Deine Frage: Ich kenne die Antwort nicht, da dies nicht das Problem ist, aber ich werde es nur zum Spaß versuchen. – BootMaker