deleteObject:如何在coreData中工作?

Ron*_*Ron 0 iphone core-data ios

我只是冒险尝试在CoreData上重写我的应用程序(之前我使用的是自己的内部保存格式).

事情大多都在起作用,虽然我对deleteObject的行为有点困惑:

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

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

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

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

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

有什么我可以做"提交"删除或至少使我的对象图表缺乏保存.每次我想要修改我的图表时,进行保存似乎有点激烈.

谢谢,罗恩

ps以下是一些对我来说很奇怪的行为:

在删除对象之前,这是父对象的"描述",它具有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>"
);
Run Code Online (Sandbox Code Playgroud)

删除"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>"
);
Run Code Online (Sandbox Code Playgroud)

Mos*_*she 6

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

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

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

  1. 创建对象A.
  2. 保存MOC
  3. 删除对象A.

对象A已标记为删除,但在您再次执行步骤2之前,实际上并未删除对象A.

与此形成对比:

  1. 创建对象B.
  2. 删除对象B.

对象B消失了,因为它从未保存过,没有"删除标记".它已经消失了.

编辑:

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