我只是大跌眼镜,并在CoreData之上重写了我的App(以前我使用的是自己的内部保存格式)。

尽管我对deleteObject:的行为感到有些困惑,但事情大部分都可以进行。

我的图形中包含一个对象,删除该对象后似乎什么也没有发生。该对象具有一些关系,其中一些关系为“级联”,而某些关系为“无效”。与对象之间的每个关系都有相反的关系。

删除对象后,似乎唯一发生变化的是在对象上设置了“ isDeleted”标志。所有关系都像以前一样存在。

如果我尝试使用NSFetchRequest查找对象,则不会找到已删除的对象。但是,如果我使用KVC关系遍历图形,则返回的NSSet包含所有对象,包括已删除的对象。

在将save:方法发送到ManagedObjectContext之后,一切都与我期望的一样。

删除时,我是否需要手动消除不想要的关系,还是需要连续保存以保持数据正常?这对我来说似乎很不直观。

我可以做些什么来“提交”删除操作,或者至少使我的对象图理智地胜过保存。每次我要修改图形时都进行保存似乎有点麻烦。

谢谢,
罗恩

ps。这对我来说似乎有些奇怪:

在删除对象之前,这是父对象的“描述”,它具有categoryObjs“多对多”关系:

categoryObjs =     (
    "0x613e1a0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p9>",
    "0x613e1b0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p12>",
    "0x613e190 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p7>"
);


删除“ p12”对象(上方的中间对象)后,通过KVC访问该关系的状态不会更改。如果我尝试获取TestCategory实体,则只能找到两个。

在“保存:”之后,p12对象消失:

categoryObjs =     (
    "0x613e1a0 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p9>",
    "0x613e190 <x-coredata://1A1AE9E7-66B1-4F4D-A7AB-07D4504CAE2C/TestCategory/p7>"
);

最佳答案

每次调用save:时,您的受管对象上下文都必须返回存储并实际写入更改。这很贵。因此,deleteObject:仅将对象标记为已删除,这将在下次保存时实际应用。 (请记住,这也有助于撤消功能,这与您要执行的操作背道而驰。)

根据文档,isDeleted属性仅说明是否在下一次提交时删除该对象,并在该对象上设置isDeleted标志。此外,如果deleteObject:从未提交,则将从上下文中删除该接收器。

例如(对象A和B是NSManagedObject实例):


创建对象A
保存MOC
删除对象A


对象A已被标记为删除,但是直到再次执行步骤2才被删除。

与此相反:


创建对象B
删除对象B


对象B不见了,因为它从未被保存过,所以没有“删除标记”。简直没了。

编辑:

我只是很好奇,您是否使用NSFetchedResultsController作为tableview的数据源?如果您还没有的话,值得研究。

10-08 05:50