【问题标题】:CoreData delete objectCoreData 删除对象
【发布时间】:2011-06-06 00:55:37
【问题描述】:

为什么不调用 prepareForDeletion: 方法?

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

[folder removeDocumentObject: doc];

“doc”对象按预期被删除,但它的 prepareForDeletion 方法永远不会被调用... =\

【问题讨论】:

    标签: iphone objective-c core-data iphone-sdk-3.0


    【解决方案1】:

    因为它没有被删除:)

    如果[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 - 您必须明确删除它。但是,您说您认为它已被删除。您能否发布您正在运行的查询以查看它是否仍在商店中?

    【讨论】:

    • 好主意,但在我的情况下,定义的关系是:文件夹 > 文档。它是 Cascade 所以“没有关系”意味着删除对象..
    • 嗯,这很奇怪。您能否向自己证明该文档已被删除,即在保存您的上下文后立即执行提取请求以检查它是否不存在 - 要么它没有被删除,要么与您的 prepareForDeletion 方法有关。 (或核心数据中的错误!)
    • 我在这里可能错了,但我相信级联删除规则就是这样 - 除非文件夹被删除,否则它不会发挥作用。删除文件夹及其所有相关的文档对象在级联中被删除。但是从文件夹中删除文档对象,您只是删除了关系。该文档将继续存在。
    • Rizon,您的 Document 实体上的“文件夹”关系是否设置为可选?如果是,可能是该文档没有被删除,只是孤立,并且它继续存在于没有拥有文件夹的商店中,并且它没有出现在您的提取请求中,因为您的提取请求只是在寻找与特定文件夹相关的文档?
    • 为什么不直接删除文档 - 这样关系会自行删除?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多