【发布时间】:2011-06-06 00:55:37
【问题描述】:
为什么不调用 prepareForDeletion: 方法?
我正在使用其祖先关系删除一个对象:
[folder removeDocumentObject: doc];
“doc”对象按预期被删除,但它的 prepareForDeletion 方法永远不会被调用... =\
【问题讨论】:
标签: iphone objective-c core-data iphone-sdk-3.0
为什么不调用 prepareForDeletion: 方法?
我正在使用其祖先关系删除一个对象:
[folder removeDocumentObject: doc];
“doc”对象按预期被删除,但它的 prepareForDeletion 方法永远不会被调用... =\
【问题讨论】:
标签: iphone objective-c core-data iphone-sdk-3.0
因为它没有被删除:)
如果[folder documentObject] 返回 nil 仅表示两个对象之间没有关系。这并不意味着该对象已从核心数据中删除。
试试这个:
[[doc managedObjectContext] deleteObject:doc];
编辑
使用此代码我已经测试了您的问题:
我在 Core Data 中创建了一个带有 Document 和 Folder 对象的新项目 - 它设置为文件夹 文件夹关系上设置了级联的文档。
// 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 语句崩溃,因为该文档不再存在于存储中。
这告诉我,仅删除关系不足以从存储中删除 Document - 您必须明确删除它。但是,您说您认为它已被删除。您能否发布您正在运行的查询以查看它是否仍在商店中?
【讨论】: