iphone core-data nsfetchedresultscontroller

iphone - Intento ilegal de establecer una relación ''xyz'' entre objetos en diferentes contextos



core-data nsfetchedresultscontroller (6)

Aquí, intenta establecer una relación entre dos objetos que se buscan / crean con un contexto diferente. Los datos principales no le permitirán establecer tales relaciones. Para lograr esto, debe buscar el segundo objeto (con el que intenta establecer una relación) con el contexto del primer objeto con objectID. Ahora deberías poder establecer una relación entre estos dos objetos. Por ejemplo:

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

¡Espero que esto te ayudará!

Estoy utilizando la aplicación de ejemplo CoreDataBooks de Apple como base para extraer datos en un segundo contexto de objetos gestionados en segundo plano, y luego fusionar esos datos en el contexto del objeto administrado principal.

Los datos que estoy obteniendo son una entidad Book con una relación uno a uno con una entidad Owner (llamada "propietario"). La entidad Owner tiene una relación de muchos con el Book (llamado "libros").

Mis datos son un documento XML de la 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 a Book N están asociados con un Owner ( "alexpreynolds, 123456" ).

Estoy analizando esto en una instancia de Owner y un NSMutableSet compuesto de instancias de Book .

Cuando intento guardar la primera vez, se guarda bien y los datos combinados aparecen en la vista de tabla.

Sin embargo, en el segundo guardado, cuando el contenido XML contiene un nuevo libro, no funciona.

Esto es lo que sucede:

Luego intento cargar en un documento XML que contiene un nuevo Book no está en el contexto del objeto administrado principal. El nuevo Book usa el mismo Owner que el que está asociado con los otros Book .

Tengo rutinas que seleccionan este objeto gestionado Owner único (que ya tengo en mi contexto de objeto gestionado principal) y el Book único que no se encuentra en el MOC principal.

A partir de esto, creo un nuevo objeto Book en el MOC secundario, y establezco su relación de " owner " para señalar al Owner único que encontré en el MOC primario.

Cuando guardo, me sale el siguiente error:

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

¿Cómo creo una nueva entidad Book en el MOC secundario, de modo que aún puedo asociarlo con un Owner preexistente en el MOC primario?


Como dice el error, no está permitido tener una relación en un objeto de Datos básicos cuyo valor esté establecido en otro objeto que se encuentre en un contexto diferente. Una forma de evitar esto es esperar hasta después de guardar el nuevo objeto y volver a fusionarlo en el contexto principal, luego establecer la relación del owner según corresponda (ya que ambos objetos están ahora en el mismo contexto, no hay problema con eso) .


No puede tener relaciones entre objetos en diferentes contextos de objetos gestionados. Entonces, una forma de evitarlo es llevar el objeto al contexto del objeto gestionado.

Por ejemplo:

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

Entonces, lo que estás haciendo es ir a buscar el Book en el mismo contexto de objeto administrado con el owner . Tenga en cuenta, sin embargo, que esto solo es posible si el book ya se ha guardado. El contexto del objeto administrado va a buscar el objeto en el almacén persistente, por lo que debe guardarse primero.


Tuve el mismo problema y esta frase me ayudó a resolver el error.

No puede tener relaciones entre objetos en diferentes contextos de objetos gestionados. Entonces, una forma de evitarlo es llevar el objeto al contexto del objeto gestionado.

Aquí está mi código (reemplacé las variables para que funcione):

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

Espero que esto ayude :)


Versión Swift ...

context.insert(objectFromOtherContext)


book *book = [mainContext ........] //Get book from default context NSManagedObjectID *objectId = [book objectID]; Book *tmpBook = [tmpContext objectWithID:objectId]; //Now book has the legal relationship