2011-10-22 13 views
7

Attualmente tutti i miei salvataggi sono in memoria ma non vengono scritti su disco (iOS). La mia app è configurata con un UITableView con una vista modale aggiunta presentata sopra per creare contenuto, quando l'utente ha terminato di creare il contenuto e il pulsante di salvataggio fa clic sul nuovo elemento (classe NSManagedObject creata dal mio modello CoreData) lo stampo ed è completamente compilato. Immediatamente dopo questo provo a salvarlo su disco e viene prodotto un messaggio di errore con lo stesso ID oggetto eccetto che i campi sono nulli. In ogni caso viene chiamato il mio metodo UITableViews - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath che sta registrando @"CanEdit".Codice di errore 1570 CoreData

Qualcuno può vedere cosa sto facendo male?

Ecco il codice

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

e qui è il mio errore

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

possibile duplicato di [iphone Core Data Errore irrisolto durante il salvataggio] (http://stackoverflow.com/questions/1283960/iphone-core-data-unresolved-error-while-saving) – millimoose

+0

L'ho visto prima, lo so questo errore è dovuto al fatto che non è stato impostato un campo obbligatorio, ma la mia domanda è: perché passa dall'essere impostato a non essere impostato subito dopo? – xizor

+0

Il messaggio di errore è per una diversa entità ('0x81a0ab0') rispetto a quella che si sta loggando (' 0x6e89010'), e sembra che uno contenga l'altro. I dati principali supportano il collegamento in cascata? In tal caso, significa che stai salvando due oggetti con una sola chiamata e che gli attributi dell'oggetto contenitore sono nulli. – millimoose

risposta

16

Il problema è che si dispone di un MO nel vostro contesto che ha richiesto i campi impostati a zero. In particolare questo sta dicendo NSValidationErrorKey=content che nel precedente NSValidationErrorObject viene stampato come zero.

O si è verificato un errore logico in cui i valori non vengono impostati correttamente nell'MMO, oppure è necessario modificare il modello per rendere facoltativo tale campo.

+1

Grazie, ho scoperto prima che questo è ciò che il codice di errore significa che l'unica domanda è perché il mio oggetto cambia da content = ae name = a nel primo registro a content = nil e name = nil il log dell'errore messaggio e si verificano subito dopo l'altro. Le sto impostando con newItem.name = @ "testo qui" - non è questo il modo corretto? – xizor

+1

Questo è corretto. Sembra che tu possa avere un altro oggetto creato che non viene popolato correttamente. Verifica che stai solo creando il numero di oggetti che ti aspetti. Imposta un punto di interruzione nel metodo init della sottoclasse. – logancautrell

+0

Grazie, è stato il problema che ho inavvertitamente creato un altro oggetto. – xizor

0

Dall'output di errore sopra, è possibile vedere che ci sono due oggetti diversi, uno con l'indirizzo 0x6e89010 contenente i dati, un altro con l'indirizzo 0x6e88fb0 dove i campi richiesti sono nil.

L'origine di questo errore deve essere contenuta nel codice che non è stato inserito.

mia raccomandazione al fine di evitare questo tipo di problemi è quello di seguire il seguente modello di progettazione che viene utilizzato anche nella demo di Apple:

  • Passare il contesto oggetto gestito da un alloggio ai controller di vista modale. È consigliabile avere solo un contesto dell'oggetto gestito.
  • Creare un nuovo oggetto gestito all'avvio del controller di input con [NSEntityDescription insertNewObjectForEntityForName:entityName inManagedObjectContext:self.managedObjectContext];
  • Mentre l'utente immette i dati, assegnare subito le proprietà/gli attributi al nuovo oggetto.
  • Quando l'utente preme "Salva", salvare le modifiche con [self.managedObjectContext save:&error];
  • Se l'utente annulla, eliminare l'oggetto dal contesto con [self.managedObjectContext deleteObject:insertedObject];

Questo è molto efficiente e tende ad evitare gli errori degli oggetti vaganti.

Problemi correlati