【问题标题】:NSManagedObject is not deleted unless a fetch is requested除非请求获取,否则不会删除 NSManagedObject
【发布时间】:2012-08-31 17:31:25
【问题描述】:

我正在从核心数据中删除一个托管对象,如下所示:

[item.managedObjectContext deleteObject:item];

(请注意,此项目已创建,但此时未保存。)

试图修复一个错误,我想确认该项目确实已被删除。首先,由于每个“项目”都属于一个“列表”,我记录了 list.items 前后的计数。没有变化。嫌疑人。

为了更加确定,我在删除前后添加了一个获取请求,并记录了上下文中的项目总数。这就是奇怪的地方。

我发现执行 fetch 的行为消除了我最初的错误。换句话说,如果我在删除前后执行一次 fetch,我可以清楚地看到上下文中的项目数减少了一个。但是,如果没有此提取,则不会删除该项目(或至少不会立即删除)。

有人对这里发生的事情有所了解吗?

【问题讨论】:

  • 你在做[managedObjectContext保存]操作吗?
  • 否 - 不需要,因为在添加项目时未保存上下文。这里的基本流程是用户想要添加一个项目,所以我创建它(不保存)并呈现一个模式。如果用户添加项目,我会保存上下文。如果他们取消,我只是删除对象(不保存)。这是使用委托发生的,并且以我找到的 Apple 演示为模型。
  • 这是你的问题,@Abizem 是正确的。这些插入和删除的对象存在于内存中但被标记为插入或删除的对象,直到您保存删除的对象仍然存在(但标记为待删除)
  • 除非它们似乎在我执行提取后立即被删除(仍然没有事先保存)?

标签: ios core-data nsmanagedobject


【解决方案1】:

deleteObject 方法实际上并没有删除对象 - 它会将其标记为删除。在提交更改之前不会真正进行更改。

编辑添加

扩展答案以响应 cmets:

如果您想知道上下文是否已更改,以便知道何时触发 fetch 请求,那么您可以注册观察NSManagedObjectContextObjectsDidChangeNotification,当上下文中的对象发送 deleteObject 消息时发送。

【讨论】:

  • 但是对象从一开始就没有被保存——它被添加和删除,中间没有保存操作。
  • 没关系。如果它没有被持久化,它只是从托管对象上下文中丢弃,但结果是一样的;删除实际上并没有删除对象。
  • 那么它什么时候被实际删除(除了显式保存)?第一次有人查询上下文?这就是为什么它被我立即执行一个提取请求就被删除的原因吗?
  • 除非您需要对数据执行任何操作,否则删除它是没有意义的。这意味着您可以进行多次删除,但直到您实际询问存储的状态,才会进行任何删除,并且相关的更改会通过存储传播。
  • 知道了 - 非常感谢。我的问题是,在我删除对象并返回我的视图后,它想检查列表中存在多少项目。它通过查询 list.items 来做到这一点,(我猜)它不会询问商店的状态。我需要重新获取(而不是查看 list.items),或者更简单地说,只需保存 context 。添加一个项目,删除它,并且必须保存我的上下文,这感觉很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-07
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2016-05-27
  • 1970-01-01
相关资源
最近更新 更多