Objeto de eliminación de CoreData

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

Estoy eliminando un objeto usando su relación de ancestro:

[folder removeDocumentObject: doc];

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

preguntado el 09 de enero de 11 a las 10:01

1 Respuestas

Porque no se está borrando :)

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

Pruebe lo siguiente:

[[doc managedObjectContext] deleteObject:doc];

EDITAR

Usando este código he probado su problema:

Hice un nuevo proyecto con un objeto Documento y Carpeta en Datos básicos; está configurado en la carpeta <<--> documento con cascasde establecido en la relación de 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 dos primeras declaraciones de NSLog funcionan correctamente: obtengo una descripción del documento y una cadena para el título.

Las segundas declaraciones de NSLog fallan 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. ¿Puede publicar la consulta que está ejecutando para ver si todavía está en la tienda o no?

Respondido el 10 de enero de 11 a las 16:01

buen pensamiento, 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

Hmmm, eso es extraño. ¿Puede demostrarse a sí mismo que el documento ha sido eliminado, es decir, hacer una solicitud de búsqueda inmediatamente después de guardar su contexto solo para verificar que no está allí? (¡o un error en los datos centrales!) - decano Wombourne

Puede que me equivoque aquí, pero creo que la regla de eliminación en cascada es solo eso: no entra en juego a menos que se elimine la carpeta. Eliminar la carpeta y todos los objetos de documento relacionados se eliminan en cascada. Pero elimine el objeto de documento de la carpeta y simplemente eliminará la relación. El documento seguirá existiendo. - Simon Cave

Rizon, ¿la relación de 'carpeta' en su entidad Documento está configurada como opcional? Si es así, ¿podría ser que el documento no se está eliminando, simplemente queda huérfano y que continúa existiendo en la tienda sin una carpeta propietaria, y no aparece en su solicitud de recuperación porque su solicitud de recuperación solo está buscando ¿Documentos relacionados con una carpeta en particular? - Simon Cave

¿Por qué no simplemente eliminar el documento en su lugar, de esa manera la relación se eliminaría por sí misma? - decano Wombourne

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.