Illegal Versuch, eine Beziehung ‚xyz‘ zwischen Objekten in unterschiedlichen Kontexten zu etablieren
-
20-09-2019 - |
Frage
Ich bin mit Apples CoreDataBooks
Beispielanwendung als Grundlage für die Daten in einen sekundären verwaltete Objektkontext im Hintergrund ziehen, und dann diese Daten in den primären verwaltete Objektkontext zu verschmelzen.
Die Daten, die ich ziehen werde in einer Book
Einheit mit einer zu-Eins-Beziehung mit einer Owner
Einheit (genannt „Eigentümer“). Die Owner
Einheit hat eine n-Beziehung mit dem Book
(genannt „Bücher“).
Meine Daten ein XML-Dokument in der Form:
<Owner>
<Name>alexpreynolds</Name>
<ID>123456</ID>
</Owner>
<Books>
<Book>Book One</Book>
<Book>Book Two</Book>
...
<Book>Book N</Book>
</Books>
Book One
durch Book N
werden zusammen mit einem Owner
("alexpreynolds, 123456"
).
ich dies in eine Owner
Instanz Parsen und ein NSMutableSet
von Book
Instanzen aus.
Als ich das erste Mal zu retten versuchen, es spart in Ordnung und die Daten zeigen in der Tabellenansicht zusammengefasst werden.
Auf dem zweiten speichern, jedoch, wenn die XML-Inhalte ein neues Buch enthält, es funktioniert nicht.
Hier ist, was passiert:
Ich versuche dann zu Last in einem XML-Dokument, das eine neue Book
nicht bereits in dem primären verwaltete Objektkontext enthält. Die neue Book
wird mit dem gleichen Owner
wie das, was mit dem anderen Book
s verbunden ist.
Ich habe Routinen, die dieses einzigartigen Owner
verwaltete Objekt auswählen (die ich bereits in meinem primären verwaltete Objektkontext habe) und die einzigartigen Book
das ist nicht in der primären MOC gefunden.
Daraus erstelle ich ein neues Book
Objekt im Sekundär MOC, und ich gesetzt sein „owner
“ Beziehung zu Punkt des einzigartigen Owner
ich in der primären MOC gefunden.
Wenn ich speichern, ich die folgende Fehlermeldung erhalten:
*** Terminating app due to uncaught
exception 'NSInvalidArgumentException',
reason: 'Illegal attempt to establish a
relationship 'owner' between objects in
different contexts
(source = <Book: 0x7803590>
(entity: Book; id: 0x7802ae0 <x-coredata:///
Book/t527F06B2-3EB5-47CF-9A29-985B0D3758862>
; data: {
creationDate = 2009-10-12 06:01:53 -0700;
name = nil;
nameInitial = nil;
operations = (
);
owner = nil;
type = 0;
}) ,
destination = <Owner: 0x78020a0> (entity:
Owner; id: 0x3a56f80 <x-coredata://043AF2F0-1AD0-
4078-A5E8-E9D7071D67D1/Owner/p1> ; data: {
books = "<relationship fault: 0x7801bf0 'books'>";
displayName = alexpreynolds;
ownerID = 123456;
}))'
Wie erstelle ich eine neue Book
Einheit im Sekundär MOC, so dass ich immer noch mit einem bereits bestehenden Owner
im primären MOC zuordnen kann?
Lösung
Sie können nicht über Beziehungen zwischen Objekten in verschiedenen verwalteten Objekt Kontexten. So eine Art der Fortbewegung das ist das Objekt in den verwaltete Objektkontext zu bringen.
Zum Beispiel:
NSManagedObject *book = // get a book in one MOC
NSManagedObject *owner = // get an owner in a different MOC
[[owner mutableSetValueForKey:@"books"] addObject:[owner.managedObjectContext objectWithID:[book objectID]]];
Also, was Sie tun, ist eigentlich den Book
in demselben verwalteten Objektkontext mit owner
holen. Beachten Sie aber, dass dies nur möglich ist, wenn book
bereits gespeichert wurde. Der verwaltete Objektkontext wird für das Objekt in dem persistenten Speicher suchen, so dass es zunächst gespeichert werden muss.
Andere Tipps
Ich hatte das gleiche Problem und dieser Satz hat mir geholfen, den Fehler zu lösen.
Sie können keine Beziehungen zwischen Objekten in verschiedenen geschafft haben, Objekt Kontexten. So ein Weg, um das zu bekommen ist zu bringen Objekt in den Objektkontext verwaltet werden.
Hier ist mein Code (I ersetzt die Variablen, um es für Sie zu arbeiten):
// Have the owner object and get the managedObjectContext
Owner *owner = [[DataFunctions alloc] getCurrentOwner];
NSManagedObjectContext *context = [owner managedObjectContext];
// Create a book and use the manageObjectContext of owner
Book *book = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
[newQuote setValue: "Book Title" forKey:@"title"];
[newQuote setOwner:owner];
Ich hoffe, das hilft:)
Hier werden Sie versuchen, eine Beziehung zwischen zwei Objekten zu schaffen, die abgerufen werden / mit einem anderen Kontext erstellt. Kerndaten werden nicht zulassen, dass Sie solche Beziehungen zu etablieren. Um dies zu erreichen, sollen Sie das zweite Objekt holen (Sie versuchen, eine Beziehung mit machen) mit dem Kontext des ersten Objekts mit objectID. Nun sollten Sie in der Lage sein, eine Beziehung zwischen diesen beiden Objekten zu etablieren. Zum Beispiel:
MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in
let user = User.MR_createEntityInContext(localContext)!
.....
.....
}) //here local context stores data on end of block itself
MagicalRecord.saveWithBlock({[unowned self] (localContext: NSManagedObjectContext!) in
let address = Address.MR_createEntityInContext(localContext)!
.....
.....
let user = localContext.objectWithID(self.user!.objectID) as! User
user.address = address
})
Hope dies wird Ihnen helfen!
Wie der Fehler sagt, sie ist nicht eine Beziehung in einem Core Data-Objekt, dessen Wertes auf ein anderes Objekt wird in einem anderen Kontext gehalten haben darf. Eine Möglichkeit, dies zu umgehen kann, ist, speichern das neue Objekt, bis Sie warten und verschmelzen sie wieder in den primären Kontext, stellen Sie dann die owner
Beziehung als angemessen (da beide Objekte jetzt im gleichen Kontext sind, gibt es kein Problem damit) .
book *book = [mainContext ........] //Get book from default context
NSManagedObjectID *objectId = [book objectID];
Book *tmpBook = [tmpContext objectWithID:objectId]; //Now book has the legal relationship
Swift Version ...
context.insert(objectFromOtherContext)