No se puede actualizar el object que nunca se insertó.

Creo un object de categoría y lo guardo:

NSManagedObjectContext *managedObjectContext = [[FTAppDelegate shanetworkingAppDelegate] managedObjectContext]; _category = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext]; NSError *error = nil; [managedObjectContext save:&error]; if (error) { NSLog(@"error saving: %@",error); } 

luego edite el nombre del object de categoría y guarde nuevamente.

  _category.name = _nameTextField.text; NSManagedObjectContext *managedObjectContext = [[FTAppDelegate shanetworkingAppDelegate] managedObjectContext]; NSError *error = nil; [managedObjectContext save:&error]; if (error) { NSLog(@"error saving: %@",error); } 

y recibe este error:

  2013-01-12 17:53:11.862 instacat[7000:907] Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn't be completed. (Cocoa error 134030.)" UserInfo=0x2027b300 {NSAffectedObjectsErrorKey=( "<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-conetworkingata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n categoryId = nil;\n isPrivate = 0;\n name = techies;\n users = (\n );\n})" ), NSUnderlyingException=Cannot update object that was never inserted.}, { NSAffectedObjectsErrorKey = ( "<Category: 0x1ed43cf0> (entity: Category; id: 0x1ed52970 <x-conetworkingata://68E5D7B6-D461-4962-BC07-855349DB3263-7000-00000141BAB4C399/Category/tE8AB2F2E-C14C-4E93-8343-CC245B7726622> ; data: {\n categoryId = nil;\n isPrivate = 0;\n name = techies;\n users = (\n );\n})" ); NSUnderlyingException = "Cannot update object that was never inserted."; } 

Gracias por su time y consideración.

Estoy usando AFIncrementalStore.

Qué tal algo como esto:

 self.category.name = self.nameTextField.text; NSManagedObjectContext *managedObjectContext = [[FTAppDelegate shanetworkingAppDelegate] managedObjectContext]; if(![self.category isInserted]) { [managedObjectContext insertObject:self.category]; } NSError *error = nil; [managedObjectContext save:&error]; if (error) { NSLog(@"error saving: %@",error); } 

Básicamente, compruebe si el object se ha insertado antes, si no, insértelo y luego guarde el context.

Cuando actualiza un object, no puede usar insertNewObjectForEntityForName, primero debe save su object, luego llamar a algo similar

  [self.managedObjectContext refreshObject:_category mergeChanges:YES] 

Luego, use managedObjectContext para save nuevamente.

Esta es la diferencia en el SQL directo como "INSERTAR" y "ACTUALIZAR".

Su object está perdiendo managedObjectContext. Uso

 self.managedObjectContext 

o reintroducir el object en

 [[FTAppDelegate shanetworkingAppDelegate] managedObjectContext] 

y edite el object reabastecido y luego guárdelo.

Tengo el mismo error, pero el escenario es diferente y raro, ocurre una vez en casi 100 bashs. Encuentra mi problema a continuación:

Tengo 2 NSManagedObjects en el model de datos centrales: 1- Lead 2- LeadAttirbute Lead tiene una relación 1-M con LeadAttribute.

Hay un formulario que ingresa para el plomo y actualiza (crea nuevo plomo) el formulario después de enviar un plomo. Si sigo presentando los prospectos, entonces en una etapa, [managedObjectContext save: & error]; comienza a dar el siguiente error:

Dominio = NSCocoaErrorDomain Code = 134030 "La operación no pudo completarse (Cocoa error 134030.)" UserInfo = 0x1f251740 {NSAffectedObjectsErrorKey = ("(entity: LeadInfoAttribute; id: 0x1f2eb920; data: {\ n attributeId = 0; \ n lead = nil; \ n optional = nil; \ n orderId = 0; \ n title = nil; \ n value = Bjjbjp; \ n}) "), NSUnderlyingException = No se puede actualizar el object que nunca se insertó. }

Y sigue dando el mismo error hasta que no termino y relanzar la aplicación. No puedo actualizar nada en el model de datos del núcleo después de que se produzca este error, por lo que mis preguntas son:

1- ¿Podemos eliminar el estado de falla de los datos del núcleo? es decir, para capturar y eliminar el object que está creando problemas antes de volver a hacer la llamada de guardado.

2- ¿Cuáles podrían ser los posibles motivos de este problema? Dado que es muy raro y no puede reproducirse en todo momento.

Lo que creo que está sucediendo es que no obtienes el NSManagedObjectContext adecuado.

Piensa en ello como una session. Entonces cuando actualizas no obtienes la session correcta y tu object no existe allí.

Antes de hacer el segundo guardado intenta encontrar tu object en ese NSManagedObjectContext. Si necesita más ayuda, describa lo que sucede entre la creación y la actualización.

Obtener el NSManagedObjectContext incorrecto puede deberse a un código incorrecto en AppDelegate o al acceso desde otro hilo que no sea el hilo principal.

Acabo de encontrar este problema y, en mi caso, el problema fue el siguiente:

  • 1) crear un nuevo object gestionado en context A
  • 2) save el context A
  • 3) recupera este object por objectID del context B
  • 4) realiza cambios en el object gestionado y guarda el context B

Normalmente no sería un problema, pero en este caso el context A es un context secundario y, por lo tanto, no se guarda en un almacenamiento persistente (solo para el context padre, que no es el context B). Entonces, cuando la búsqueda del object gestionado se realiza desde el context B, el context no tiene este object. Cuando se realizan cambios, el context intenta savelos de todos modos … y eso ocurre cuando se produce este error. En algunos casos (como mencionó @Trausti Thor) el object refresh: mergeChanges: el método podría ayudar (pasa los datos a otro context).

En su caso, verificaré si:

1) el context de object gestionado desde [[FTAppDelegate shanetworkingAppDelegate] managedObjectContext] vuelve siempre en el mismo context

2) cuando guarda la categoría, compruebe si realmente se guardó en la tienda persistente (self.category.objectID.isTemporaryID == NO)

NOTA: El segundo punto es más importante, ya que si observa cuidadosamente, su object de categoría todavía tiene objectID temporal, eso significa que no se mantiene.