gpt4 book ai didi

iphone - 如何删除对象 : work in coreData?

转载 作者:行者123 更新时间:2023-11-28 18:26:58 25 4
gpt4 key购买 nike

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

虽然我对 deleteObject: 的行为有点困惑,但大部分情况下一切正常。

我有一个对象是我的图表的一部分,当我删除它时,该对象似乎没有任何变化。该对象具有一些关系,其中一些是“级联”,一些是“无效”。与对象/来自对象的每个关系都具有反向关系。

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

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

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

当我进行删除时,我是否需要手动清除我不想要的关系,或者我是否需要不断保存以保持我的数据完好无损?这对我来说似乎非常违反直觉。

我可以做些什么来“提交”删除,或者至少让我的对象图在不进行保存的情况下保持清醒。每次我想修改图表时都进行保存似乎有点过激。

谢谢,罗恩

附注以下是一些我觉得很奇怪的行为:

在删除对象之前,这是父对象的“描述”,它具有 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 实例):

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

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

与此对比:

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

对象 B 消失了,因为它从未保存过,所以没有“标记为删除”。它就这样消失了。

编辑:

我很好奇,您是否将 NSFetchedResultsController 用于 tableview 的数据源?值得一看,如果您还没有的话。

关于iphone - 如何删除对象 : work in coreData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com