Illegal Versuch, eine Beziehung ‚xyz‘ zwischen Objekten in unterschiedlichen Kontexten zu etablieren

StackOverflow https://stackoverflow.com/questions/1554623

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 Books 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?

War es hilfreich?

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top