So richten Sie die Core Data-Beziehung automatisch ein, wenn Sie verschachtelte Kontexte verwenden
Ich kämpfe darum, eine vernünftige Lösung für ein Problem zu finden, das bei der Verwendung verschachtelter verwalteter Objektkontexte in Kerndaten auftritt. Nehmen Sie ein Modell mit zwei Eigenschaften, Person und Name, wobei jede Person eine Eins-zu-Eins-Beziehung zu einem Namen hat und die Personenbeziehung von Name nicht optional ist. Zuvor persönlich-awakeFromInsert
Nach dieser Methode würde ich automatisch eine Name-Entität für die neue Person erstellen:
- (void)awakeFromInsert
{
[super awakeFromInsert];
NSManagedObjectContext *context = [self managedObjectContext];
self.name = [NSEntityDescription insertNewObjectForEntityForName:@"Name" inManagedObjectContext:context];
}
Dies funktioniert problemlos in einem einzelnen, nicht verschachtelten verwalteten Objektkontext. Wenn der Kontext jedoch einen übergeordneten Kontext hat, wird beim Speichern des untergeordneten Kontexts ein neues Personenobjekt im übergeordneten Kontext und erstellt-awakeFromInsert
wird auf diesem neuen Objekt erneut aufgerufenVor Die Eigenschaften und Beziehungen der ursprünglichen Person werden kopiert. So wird ein anderes Name-Objekt erstellt und dann "getrennt", wenn die vorhandene Namensbeziehung kopiert wird. Das Speichern schlägt fehl, da die Überprüfung des Now-Nils des schwebenden Namens fehlschlägtperson
Beziehung schlägt fehl. Dieses Problem wird beschriebenHier sowie an anderen Orten.
Bisher konnte ich keine gute Lösung für dieses Problem finden. Das träge Erstellen der Beziehung in der Getter-Methode verursacht dasselbe Problem, da der Getter von der internen Core Data-Maschine aufgerufen wird, wenn die neue Person im übergeordneten Kontext erstellt wird.
Das einzige, was ich mir einfallen lassen kann, ist, auf die automatische Generierung von Beziehungen zu verzichten und die Beziehung immer explizit entweder in der Controller-Klasse zu erstellen, die die Person erstellt, oder in einer praktischen Methode (z.+[Person insertNewPersonInManagedObjectContext:]
), die nur von meinem Code aufgerufen wird, und istimmer Die Methode, mit der ein neues Person-Objekt explizit erstellt wird. Vielleicht ist dies die beste Lösung, aber ich würde es vorziehen, nicht so streng sein zu müssen, um nur die Verwendung einer einzelnen Methode zum Erstellen verwalteter Objekte zuzulassen, wenn andere Erstellungsmethoden, über die ich keine Kontrolle habe und deren Verwendung ich nicht kann leicht überprüfen / ausschließen, existieren. Zum einen bedeutet dies, dass mehrere NSArrayController-Unterklassen die Art und Weise anpassen, in der sie verwaltete Objekte erstellen.
Hat jemand anderes, der auf dieses Problem gestoßen ist, eine elegante Lösung gefunden, mit der ein NSManagedObject beim Erstellen / Einfügen automatisch ein Beziehungsobjekt erstellen kann?