我只是大跌眼镜,并在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的数据源?如果您还没有的话,值得研究。