CoreData удалить объект - PullRequest
       9

CoreData удалить объект

7 голосов
/ 09 января 2011

Почему метод prepareForDeletion: не вызывается?

Я удаляю объект, используя отношение его предка:

[folder removeDocumentObject: doc];

Объект "doc" удаляется, как и ожидалось, но его метод prepareForDeletion никогда не вызывается ... = \

1 Ответ

16 голосов
/ 09 января 2011

Потому что он не удаляется:)

Если [folder documentObject] возвращает ноль, это просто означает, что между этими двумя объектами нет никакой связи. Это не значит, что объект удален из основных данных.

Попробуйте это:

[[doc managedObjectContext] deleteObject:doc];

EDIT

Используя этот код, я проверил вашу проблему:

Я создал новый проект с объектом Document and Folder в Core Data - для него задана папка << -> document с каскадом, установленным для отношения папки.

// 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]);

Первые два оператора NSLog работают правильно - я получаю описание документа и строку для заголовка.

Вторые операторы NSLog аварийно завершают работу, поскольку документ больше не существует в хранилище.

Это говорит мне о том, что простого удаления отношения недостаточно для удаления Документа из хранилища - вы должны явно удалить его. Однако вы говорите, что думаете, что он удален. Можете ли вы опубликовать запрос, который вы выполняете, чтобы увидеть, находится ли он еще в магазине или нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...