Ich habe Mühe, eine vernünftige Lösung für ein Problem zu finden, das bei der Verwendung verschachtelter Kontexte für verwaltete Objekte in Core Data auftritt. Nehmen Sie ein Modell mit zwei enites, Person und Name, an, wobei jede Person eine Eins-zu-Eins-Beziehung mit einem Namen hat und die Personenbeziehung des Namens nicht optional ist. Zuvor in -awakeFromInsert
Methode der Person, würde ich automatisch einen Namen Einheit für die neue Person erstellen:So richten Sie die Core Data-Beziehung automatisch ein, wenn verschachtelte Kontexte verwendet werden
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
Dies funktioniert gut in einem einzigen, nicht-verschachtelten Objektkontext verwaltet. Wenn der Kontext jedoch einen übergeordneten Kontext hat, wird beim Speichern des untergeordneten Kontexts ein neues Person-Objekt im übergeordneten Kontext erstellt, und -awakeFromInsert
wird erneut für dieses neue Objekt aufgerufen, bevor die Eigenschaften und Beziehungen der ursprünglichen Person kopiert werden. Also wird ein anderes Name-Objekt erstellt und dann "getrennt", wenn die bestehende Namensbeziehung kopiert wird. Das Speichern schlägt fehl, da die Überprüfung der jetzt nichtig Beziehung des schwebenden Namens fehlschlägt. Dieses Problem wird here sowie an anderen Stellen beschrieben.
Bis jetzt konnte ich keine gute Lösung für dieses Problem finden. Das mühsame Erstellen der Beziehung in der Getter-Methode verursacht das gleiche Problem, da der Getter von der internen Core Data-Maschine aufgerufen wird, wenn die neue Person im übergeordneten Kontext erstellt wird.
Die einzige Sache, die ich finden kann, besteht darin, auf die automatische Beziehungsgenerierung zu verzichten und die Beziehung immer entweder in der Controller-Klasse, die die Person erstellt, oder in einer Komfortmethode (z. B. +[Person insertNewPersonInManagedObjectContext:]
), die nur von my aufgerufen wird, explizit zu erstellen Code und ist immer die Methode, die verwendet wird, um ein neues Person-Objekt explizit zu erstellen. Vielleicht ist dies die beste Lösung, aber ich möchte nicht so streng sein, nur eine einzige Methode zum Erstellen verwalteter Objekte zuzulassen, wenn andere Erstellungsmethoden, über die ich keine Kontrolle habe und deren Verwendung ich nicht kann check for/exclude, exist. Zum einen bedeutet dies, dass mehrere NSArrayController-Unterklassen die Art und Weise anpassen, wie sie verwaltete Objekte erstellen.
Hat jemand anderes, der auf dieses Problem gestoßen ist, eine elegante Lösung gefunden, die es einem NSManagedObject ermöglicht, ein Beziehungsobjekt beim Erstellen/Einfügen automatisch zu erstellen?
Lassen Sie uns die Beziehung annehmen, optional werden. Dann würden Sie ein verwaistes Name-Objekt und zwei "richtige" Name-Objekte in ihrem jeweiligen Kontext haben. Es wäre interessant: 1. herauszufinden, ob die "richtigen" Objekt-IDs noch identisch sind (sie werden später sein, aber für den Moment sind sie temporär) und 2. wenn die ID des verwaisten Name-Objekts anders ist. Wenn dies der Fall ist, könnten Sie auch wakeFromInsert für Name implementieren, so dass es im untergeordneten Kontext nach einem Geschwister sucht und sich selbst löscht, wenn es keinen findet. Es würde dann vor dem Speichern aus dem Kontext entfernt werden und hoffentlich vor der Validierung ... – Toastor
Hmm Ich denke, ich könnte falsch liegen - da an dem Punkt, an dem der verwaiste Name erstellt wird, der Kindkontext bereits gespeichert wurde, die IDs für die " Richtige "Namensobjekte" dürfen mich im Moment anders sehen, da ein Name gespeichert wurde und der andere noch temporär ist. Dennoch könnte es sich lohnen, es zu überprüfen ... – Toastor