deleteObject:如何在coreData中工作?

时间:2011-06-22 04:07:53

标签: iphone ios core-data

我刚刚接受了下载并在CoreData上重写了我的应用程序(之前我使用的是我自己的内部保存格式)。

事情大部分都在起作用,虽然我对deleteObject的行为感到有点困惑:。

我有一个对象是我的图形的一部分,当我删除它时,对象似乎没有发生任何事情。该对象具有关系,其中一些是“级联”,一些是“Nullify”。与对象之间的每个关系都具有反比关系。

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

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

在我将save:方法发送到我的ManagedObjectContext后,一切都如我所料。

当我删除时,是否需要手动删除我不想要的关系,或者我需要不断保存以保持数据的正确性?这对我来说似乎非常直观。

我能做些什么来“提交”删除,或者至少使我的对象图表没有做到保存。每次我想修改我的图表时,进行保存似乎有点激烈。

谢谢, 罗恩

P.S。以下是一些对我来说很奇怪的行为:

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

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>"
);

2 个答案:

答案 0 :(得分:6)

每次调用save:时,您的托管对象上下文必须返回到商店并实际写入更改。这很贵。因此,deleteObject:仅将对象标记为已删除,实际上将在下次保存时应用。 (请记住,这也有助于撤消功能,它只是违背你想做的事情。)

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

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

  1. 创建对象A
  2. 保存MOC
  3. 删除对象A
  4. 对象A已标记为删除,但在您再次执行步骤2之前,实际上并未删除。

    与此形成对比:

    1. 创建对象B
    2. 删除对象B
    3. 对象B消失了,因为它从未保存过,没有“删除标记”。它已经消失了。

      修改

      我只是好奇,您是否在为tableview的数据源使用NSFetchedResultsController?如果你还没有,那值得关注。

答案 1 :(得分:0)

我认为Core Data希望尽量减少内存和在deleteObject:期间使用IO,并在save:中执行所有heaver作业,例如写sqllite文件。这可能是最节省时间的方式。