2011-10-22 21 views
7

Actualmente, todos mis guardados van a la memoria pero no se escriben en el disco (iOS). Mi aplicación está configurada con un UITableView con una Modal View Add presentada sobre esto para crear contenido, cuando el usuario termina de crear el contenido y se hace clic en el botón Guardar el nuevo Item (clase NSManagedObject creado por mi CoreData Model) Lo imprimo y está completamente rellenado. Inmediatamente después de esto trato de guardarlo en el disco y se produce un mensaje de error con el mismo ID de objeto, excepto que los campos son nulos. Mientras tanto, se llama a mi método UITableViews - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath , que está registrando @"CanEdit".CoreData 1570 Código de error

¿Alguien puede ver lo que estoy haciendo mal?

Este es 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-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC23> ; data: { 
    containedIn = "0x6e89010 <x-coredata:///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-coredata:///Item/t7F2B54D2-0DCC-4530-88D5-900BE25C7DC22> ; data: { 
    containedIn = nil; 
    contains =  (
     "0x81a0ab0 <x-coredata:///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.)} 
+0

posible duplicado de [iphone Datos principales Error no resuelto al guardar] (http://stackoverflow.com/questions/1283960/iphone-core-data-unresolved-error-while-saving) – millimoose

+0

Vi eso antes, lo sé este error se debe a que no se ha establecido un campo obligatorio, pero mi pregunta es ¿por qué pasa de ser configurado a no ser establecido inmediatamente después? – xizor

+0

El mensaje de error es para una entidad diferente ('0x81a0ab0') que la que estás registrando (' 0x6e89010'), y parece que una contiene la otra. ¿Core Data admite la conexión en cascada? Si es así, significa que realmente está guardando dos objetos con una llamada, y los atributos del objeto del contenedor son nulos. – millimoose

Respuesta

16

El problema es que usted tiene un MO en su contexto lo que ha exigido campos establecidos a cero. Específicamente, esto está diciendo NSValidationErrorKey=content que en el NSValidationErrorObject anterior está imprimiendo como nulo.

O tiene un error de lógica donde sus valores no se establecen correctamente en el MO, o debe cambiar su modelo para hacer que ese campo sea opcional.

+1

Gracias, descubrí anteriormente que eso es lo que el código de error significa que la única pregunta es por qué mi objeto cambia de content = a y name = a en el primer registro a content = nil y name = nil el registro del error mensaje y ocurren uno después del otro. Los estoy configurando con newItem.name = @ "text here" - ¿esta no es la forma correcta? – xizor

+1

Eso es correcto. Parece que puede haber creado otro objeto que no está siendo llenado correctamente. Verifique que solo está creando la cantidad de objetos que está esperando. Establezca un punto de quiebre en el método init de la subclase. – logancautrell

+0

Gracias, ese fue el problema que inadvertidamente creé otro objeto. – xizor

0

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

El origen de este error debe estar incluido en el código que no ha publicado.

Mi recomendación con el fin de evitar este tipo de problemas es seguir el siguiente patrón de diseño que también se utiliza en las manifestaciones de Apple:

  • Pasar el contexto de objeto gestionado como un alojamiento a la vista controlador modal. Es aconsejable tener solo un contexto de objeto gestionado.
  • Crear un nuevo objeto gestionado cuando el controlador de entrada comience con [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
  • A medida que el usuario ingresa los datos, asigne las propiedades/atributos a su nuevo objeto de inmediato.
  • Cuando el usuario pulsa "Guardar", guardar los cambios con [self.managedObjectContext save:&error];
  • Si el usuario cancela, eliminar el objeto del contexto con [self.managedObjectContext deleteObject:insertedObject];

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

Cuestiones relacionadas