2011-08-18 18 views
11

Ricevo un errore durante il salvataggio mio contesto dei dati di base, ecco il log:Core Data errore irrisolto su Save

Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x1937a0 {NSAffectedStoresErrorKey=(
    "<NSSQLCore: 0x156410>" 
), NSUnderlyingError=0x181a60 "The operation couldn’t be completed. (Cocoa error 4.)", NSFilePath=/var/mobile/Applications/appid/Documents/appname.sqlite}, { 
    NSAffectedStoresErrorKey =  (
     "<NSSQLCore: 0x156410>" 
    ); 
    NSFilePath = "/var/mobile/Applications/appid/Documents/appname.sqlite"; 
    NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4 \"The operation couldn\U2019t be completed. (Cocoa error 4.)\" UserInfo=0x181a30 {NSUnderlyingError=0x108ab0 \"The operation couldn\U2019t be completed. No such file or directory\"}"; 
} 

ricevo questo errore dopo la rimozione e l'eliminazione di un oggetto:

[productList removeMProductObject:product]; 
[[delegate managedObjectContext] deleteObject:product]; 
[delegate saveContext]; 

ho anche notato che ho anche ricevere l'errore per i seguenti scenari (debug):

1. 
    [productList removeMProductObject:product]; 
    [delegate saveContext]; 

2. 
    [[delegate managedObjectContext] deleteObject:product]; 
    [delegate saveContext]; 

3. 
    [[delegate managedObjectContext] deleteObject:product]; 
    [productList removeMProductObject:product]; 
    [delegate saveContext]; 

4. 
    [[delegate managedObjectContext] deleteObject:product]; 
    [delegate saveContext];//error 
    [productList removeMProductObject:product]; 
    [delegate saveContext]; 

5. 
    [productList removeMProductObject:product]; 
    [delegate saveContext];//error 
    [[delegate managedObjectContext] deleteObject:product]; 
    [delegate saveContext]; 

a volte, posso p asino intorno allo productList o a un oggetto product (entrambi di tipo) ad altri controller, utilizzando sempre assign nella proprietà e mai retain. productList è un oggetto che può contenere molti oggetti product.

ho sono in grado di creare nuovi oggetti (NSManagedObject), ma quando si tratta di eliminarli ottengo l'errore di cui sopra. Quando eseguo l'applicazione nel simulatore tengo d'occhio il file sqlite. dopo aver tentato di cancellare un oggetto (codice sopra), noto che il file .sqlite è stato rimosso.

Ho creato alcune applicazioni iphone di Core Data senza problemi, ma sembra che abbia un problema qui. Non credo di fare nulla fuori dall'ordinario, ma forse mi manca un piccolo dettaglio, ma non so cosa!

Perché il mio file .sqlite è stato eliminato e questo messaggio di errore è stato salvato?

Come posso trovare un messaggio di errore più utile in modo da poter determinare la causa di questo errore?

risposta

14

trovato il problema, ma non sono sicuro perché lo fissa:

prima vorrei cancellare/rimuovere l'oggetto Vorrei eliminare l'immagine ad esso associata (memorizzato nella directory del documento).

L'immagine di default non ha alcun valore (pari a zero), ma vorrei tentare di eliminarlo in ogni caso:

NSError *deleteError = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:product.mPictureName] error:&deleteError]; 
#ifdef DEBUG_MODE 
     if(deleteError) { 
     NSLog(@"Error deleting image: %@", [deleteError description]); 
     } 
     else { 
     NSLog(@"Image %@ deleted.", product.mPictureName); 
     } 
#endif 

se io invece faccio un assegno pari a zero prima di tentare di rimuovere l'immagine in questo modo, i no ottenere errore quando elimino l'oggetto gestito in sé:

NSString *imageName = product.mPictureName; 
    if(imageName) { 
     NSError *deleteError = nil; 
     [[NSFileManager defaultManager] removeItemAtPath:[DOCUMENTS_DIRECTORY stringByAppendingPathComponent:imageName] error:&deleteError]; 
#ifdef DEBUG_MODE 
     if(deleteError) { 
     NSLog(@"Error deleting image: %@", [deleteError description]); 
     } 
     else { 
     NSLog(@"Image %@ deleted.", imageName); 
     } 
#endif 
    } 
    ... 
    //delete NSManagedObject and save 

Credo che il tentativo di accesso l'immagine del prodotto quando è nullo rende tutto valido.

+0

Grazie mille MOLTO. Ho avuto esattamente lo stesso problema e la soluzione era di non controllare prima le immagini. – Eugene

+0

Uomo, fantastico. Ho passato per sempre su questo. – Beaker

+5

Questo: * "dopo aver tentato di cancellare un oggetto (codice sopra), noto che il file .sqlite è stato rimosso." * Sembra che stia effettivamente cancellando l'intera directory di Documenti se 'imageName' era nullo, dal momento che' removeItemAtPath: ' rimuove le directory in modo ricorsivo e aggiungendo nulla al percorso dei documenti non fa nulla. – mvds

0

Ho avuto un problema simile che vale la pena di segnalare per qualsiasi shmo povero che viene coinvolto in questo problema. Nel mio caso ho avuto un controller di visualizzazione tabella che gestiva le eliminazioni di righe eliminando i dati corrispondenti dal modello di dati. Quando ho usato il metodo remove ## ObjectName ## Object (eliminato dalla sottoclasse NSManagedObject generata automaticamente), otterrei un errore simile a quello che hai segnalato.

Quando ho usato invece NSManagedObjectContext: deleteObject non ho avuto problemi a salvare il contesto. Ma ho osservato un'eccezione lanciata senza indicazione della ragione dalla console.

Si scopre il metodo tableview canEditRowAtIndexPath: veniva chiamato per la riga corrispondente all'oggetto appena eliminato. Era chiaro che il mio numero di righe doveva essere aggiornato prima che il sistema operativo chiamasse questo metodo. Ma non mi interessa. Semplicemente controllo per vedere se la dimensione della mia matrice di oggetti gestiti può essere indicizzata dalla riga indexPath.

if([managedObjSet.objects count] > indexPath.row) { 
     ManagedObject* obj = [managedObjectArray objectAtIndex:indexPath.row]; 
     return ([obj.anotherManagedObjSet count] ==0); 
    }