Domanda

Sto usando un'applicazione di esempio CoreDataBooks di Apple come base per tirare i dati in un contesto oggetto gestito secondaria in background, e quindi unire tali dati nel contesto oggetto gestito primaria.

I dati che sto tirando in è un'entità Book con un rapporto a-uno con un'entità Owner (chiamata "proprietario"). L'entità Owner ha un rapporto a-molti con le Book (chiamati "libri").

I miei dati è un documento XML della forma:

<Owner>
  <Name>alexpreynolds</Name>
  <ID>123456</ID>
</Owner>
<Books>
  <Book>Book One</Book>
  <Book>Book Two</Book>
  ...   
  <Book>Book N</Book>
</Books>

Book One attraverso Book N associati uno Owner ("alexpreynolds, 123456").

Io sono l'analisi di questo in un'istanza Owner e un NSMutableSet fatta di casi Book.

Quando si tenta di salvare la prima volta, consente di risparmiare bene e la fusione dei dati si presenta nella vista tabella.

Al secondo salvataggio, tuttavia, quando il contenuto XML contiene un libro nuovo, non funziona.

Ecco cosa succede:

I quindi tentare di caricare in un documento XML che contiene una nuova Book non già nel contesto oggetto gestito primario. La nuova Book utilizza lo stesso Owner di quello che è associato con gli altri Books.

Ho routine che riprendono questo oggetto gestito Owner unico (che ho già nel mio contesto oggetto gestito primario) e il Book unico che è non trovato nel MOC primaria.

Da questo, crea un nuovo oggetto Book nel MOC secondario, e ho impostato la sua relazione "owner" per indicare la Owner unica che ho trovato nella MOC primaria.

Dopo aver salvato, ottengo il seguente errore:

*** 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;
}))'

Come faccio a creare una nuova entità Book nel MOC secondario, in modo che posso ancora associarlo a un Owner pre-esistente nel MOC primario?

È stato utile?

Soluzione

Non si può avere le relazioni tra gli oggetti in diversi contesti oggetto gestito. Così un modo di muoversi che è quello di portare l'oggetto nel contesto oggetto gestito.

Ad esempio:

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]]];

Quindi quello che stai facendo è in realtà il recupero della Book nello stesso contesto oggetto gestito con owner. Tenete a mente, però, che questo è possibile solo se book è già stato salvato. Il contesto oggetto gestito è andare a cercare l'oggetto nella memoria permanente, quindi deve essere salvato prima.

Altri suggerimenti

Ho avuto lo stesso problema e questa frase mi ha aiutato a risolvere l'errore.

  

Non si può avere relazioni tra gli oggetti in diversi gestiti   contesti oggetto. Così un modo di muoversi che è quello di portare il   oggetto nel contesto oggetto gestito.

Ecco il mio codice (ho sostituito le variabili per farlo funzionare per voi):

// 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];

Spero che questo aiuta:)

Qui, si sta tentando di stabilire una relazione tra due oggetti che sono inverosimile / creati con un contesto diverso. dati fondamentali non vi permetterà di stabilire tali rapporti. Per raggiungere questo obiettivo, si dovrebbe prendere il secondo oggetto (si sta cercando di fare un rapporto con) con il contesto del primo oggetto con objectID. Ora si dovrebbe essere in grado di stabilire una relazione tra questi due oggetti. Ad esempio:

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
})

Spero che questo vi aiuterà!

Come l'errore dice, non ti è permesso di avere una relazione in oggetto Data un core il cui valore è impostato su un altro oggetto tenuto in un contesto diverso. Un modo è possibile aggirare il problema è quello di aspettare fino a dopo aver salvato il nuovo oggetto e unire di nuovo nel contesto primario, quindi impostare il rapporto owner a seconda dei casi (dal momento che entrambi gli oggetti sono ora nello stesso contesto, non c'è nessun problema con questo) .

book *book = [mainContext ........]   //Get book from default context

NSManagedObjectID *objectId = [book objectID];

Book *tmpBook = [tmpContext objectWithID:objectId]; //Now book has the legal relationship

Versione Swift ...

context.insert(objectFromOtherContext)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top