2011-01-09 693 views
7

¿Por qué no se llama al método prepareForDeletion:?CoreData delete object

estoy eliminación de un objeto mediante su relación ancestro:

[folder removeDocumentObject: doc]; 

El objeto "doc" se elimina como se esperaba, pero su método prepareForDeletion nunca se llama ... = \

Respuesta

16

Debido a que es no se elimina :)

Si [folder documentObject] devuelve nil eso significa que no hay relación entre los dos objetos. No significa que el objeto se elimine de los datos centrales.

Prueba esto:

[[doc managedObjectContext] deleteObject:doc]; 

EDITAR

Utilizando este código he probado su problema:

he hecho un nuevo proyecto con un objeto de documento y la carpeta en la base de datos - Se establece en la carpeta < < -> documento con cascasde establecido en la relación de la carpeta.

// Create a document and folder and save them 
Folder *fol = [NSEntityDescription insertNewObjectForEntityForName:@"Folder" inManagedObjectContext:[self managedObjectContext]]; 
Document *doc = [NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:[self managedObjectContext]]; 
[doc setFolder:fol]; 
[[self managedObjectContext] save:nil]; 

// Get the document's object id for later 
NSManagedObjectID *documentId = [doc objectID]; 

// Delete the relationship 
[fol removeDocumentsObject:doc]; 
[[self managedObjectContext] save:nil]; 

// Try to reload the document to see if it's still there 
Document *doc2 = (Document *)[[self managedObjectContext] objectWithID:documentId]; 

// Get a property from the document - this will fault if the document has been deleted. Otherwise it 
// will work. 
NSLog(@"%@", doc2); 
NSLog(@"%@", [doc2 title]); 

// Now delete specifically and try again 
[[self managedObjectContext] deleteObject:doc]; 
[[self managedObjectContext] save:nil]; 

// Should get a fault here 
doc2 = (Document *)[[self managedObjectContext] objectWithID:documentId]; 
NSLog(@"%@", doc2); 
NSLog(@"%@", [doc2 title]); 

Las primeras dos declaraciones NSLog funcionan correctamente: obtengo una descripción del documento y una cadena para el título.

Las segundas sentencias de NSLog se bloquean porque el documento ya no existe en la tienda.

Esto me dice que simplemente eliminar una relación no es suficiente para eliminar el documento de la tienda; debe eliminarlo explícitamente. Sin embargo, dices que crees que se ha eliminado. ¿Puedes publicar la consulta que estás ejecutando para ver si todavía está en la tienda o no?

+0

bien pensado, pero en mi caso la relación definida es: carpeta <----->> documento. Y es Cascade por lo que "sin relación" significa eliminar el objeto ... – Rizon

+0

Hmmm, eso es extraño. ¿Puede probarse a sí mismo que el documento se ha eliminado, es decir, realizar una solicitud de recuperación justo después de guardar el contexto solo para comprobar que no está allí, que no se está eliminando o tiene algo que ver con el método prepareForDeletion? (o un error en los datos básicos!) – deanWombourne

+0

tratando de buscar fetch - y el objeto está realmente borrado. Mi método prepareForDeletion se define en la clase de objeto Document como - (void) prepareForDeletion {...} – Rizon