Código de error CoreData 1570

Actualmente, todas mis salvaciones se guardan en la memory pero no se escriben en el disco (iOS). Mi aplicación está configurada con una UITableView con una vista de UITableView modal presentada para crear contenido, cuando el usuario termina de crear el contenido y el button Guardar se hace clic en el nuevo elemento (class NSManagedObject creada por mi model CoreData). Lo imprimo y se completa por completo. Inmediatamente después de esto, bash save en el disco y se produce un post de error con la misma ID de object, excepto que los campos son nulos. Entre, sin embargo, se puede llamar a mi UITableViews – (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath método (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath que está registrando @"CanEdit" .

¿Alguien puede ver lo que estoy haciendo mal?

Aquí está el código

  NSLog(@"newItem %@", newItem); NSError *error; if (![newItem.managedObjectContext save:&error]) { // Handle the error. NSLog(@"%@", error); } if (editItem) { [self.navigationController popViewControllerAnimated:YES]; } else { [self dismissModalViewControllerAnimated:YES]; } 

Y aquí está mi error

 2011-10-22 15:24:46.322 App[42115:fb03] newItem <Item: 0x81a4a30> (entity: Item; id: 0x81a0ab0 <x-conetworkingata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23> ; data: { containedIn = "0x6e89010 <x-conetworkingata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22>"; contains = ( ); content = a; dateLastUsed = nil; depth = 0; encrypted = 0; favorite = 0; favoritePosition = nil; folder = 0; fullPath = "^Templates^Add Title"; name = a; sortPosition = 0; }) 2011-10-22 15:24:46.323 App[42115:fb03] CanEdit 2011-10-22 15:24:46.326 App[42115:fb03] Error Domain=NSCocoaErrorDomain Code=1570 "The operation couldn't be completed. (Cocoa error 1570.)" UserInfo=0x6ecc490 {NSValidationErrorObject=<Item: 0x6e88fb0> (entity: Item; id: 0x6e89010 <x-conetworkingata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22> ; data: { containedIn = nil; contains = ( "0x81a0ab0 <x-conetworkingata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23>" ); content = nil; dateLastUsed = nil; depth = 0; encrypted = 0; favorite = 0; favoritePosition = nil; folder = 1; fullPath = "^Templates^"; name = Templates; sortPosition = 0; }), NSValidationErrorKey=content, NSLocalizedDescription=The operation couldn't be completed. (Cocoa error 1570.)} 

El problema es que tiene un MO en su context que ha requerido que los campos estén configurados en nil. Específicamente, esto es decir NSValidationErrorKey=content que en el NSValidationErrorObject precedente se imprime como nil.

O bien tiene un error lógico en el que los valores no se configuran correctamente en el MO, o debe cambiar su model para que ese campo sea opcional.

Desde su salida de error anterior, puede ver que hay dos objects diferentes, uno con la dirección 0x6e89010 contiene sus datos, otro con la dirección 0x6e88fb0 donde los campos obligatorios son nil .

El origen de este error debe estar contenido en el código que no publicó.

Mi recomendación para evitar este tipo de problemas es seguir el siguiente patrón de layout que también se utiliza en las demostraciones de Apple:

  • Pase el context de object administrado como una propiedad al controller de vista modal. Es recomendable tener solo un context de object gestionado.
  • Cree un nuevo object gestionado cuando el controller de input comience con [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
  • Cuando el usuario ingrese los datos, asigne las properties / attributes a su nuevo object de inmediato.
  • Cuando el usuario [self.managedObjectContext save:&error]; "Guardar", guarde los cambios con [self.managedObjectContext save:&error];
  • Si el usuario cancela, elimine el object del context con [self.managedObjectContext deleteObject:insertedObject];

Esto es muy eficiente y tiende a evitar errores de objects perdidos.