CoreData删除对象

Riz*_*zon 7 iphone core-data objective-c iphone-sdk-3.0

为什么不调用prepareForDeletion:方法?

我正在使用它的祖先关系删除一个对象:

[folder removeDocumentObject: doc];
Run Code Online (Sandbox Code Playgroud)

"doc"对象会像预期的那样被删除,但它的prepareForDeletion方法永远不会被调用... = \

dea*_*rne 16

因为它没有被删除:)

如果[folder documentObject]返回nil,则意味着两个对象之间没有关系.这并不意味着从核心数据中删除对象.

试试这个 :

[[doc managedObjectContext] deleteObject:doc];
Run Code Online (Sandbox Code Playgroud)

编辑

使用此代码我测试了您的问题:

我在Core Data中创建了一个带有Document and Folder对象的新项目 - 它被设置为文件夹<< - >文件,并在文件夹关系上设置了cascasde.

// 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]);
Run Code Online (Sandbox Code Playgroud)

前两个NSLog语句正常工作 - 我得到了文档的描述和标题的字符串.

第二个NSLog语句崩溃,因为该文档不再存在于商店中.

这告诉我,仅删除关系不足以从商店中删除文档 - 您必须明确删除它.但是,你说你认为它被删除了.你可以发布你正在运行的查询,看看它是否还在商店里?

  • 我可能在这里错了,但我相信Cascade删除规则就是这样 - 除非删除文件夹,否则它不起作用.删除文件夹,并在级联中删除其所有相关的Document对象.但是从文件夹中删除文档对象,您只是删除了关系.该文件将继续存在. (2认同)