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