核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?

Posted

技术标签:

【中文标题】核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?【英文标题】:Core Data fetching... Why doesn't Managed Object get fetched using context B after inserting it in context A and saving context A?核心数据获取...为什么在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象? 【发布时间】:2012-03-31 02:53:30 【问题描述】:

我不确定我在这里遗漏了什么,所以我会尝试解释我遇到的问题。

我有两个 nsmanagedobjectcontexts。我称他们为 A 和 B。

    我在 A 中插入了一个新实体 E 我救A 从 B 我尝试使用简单的 fetchRequest 获取商店中找到的所有 E 实体 在执行 NSFetchRequest 以从 B 获取所有 E 实体时,即使 A 已保存,我也无法获取插入 A 中的实体。 如果我对 A 执行 NSFetchRequest,我可以获得 E。

我认为一旦我保存了一个上下文,该上下文中的 ManagedObject 就会保存到持久存储中(我只有一个持久存储设置)。所以我想我可以从我想要的任何上下文中获取托管对象 E,因为任何 NSFetchedRequest 都会从持久存储中获取到我正在执行它的上下文中。

我在这里缺少什么?为什么在保存了最初插入 E 的上下文 A 后,我无法从我想要的任何上下文中获取 E?

【问题讨论】:

【参考方案1】:

您需要将上下文 A 中的更改合并到上下文 B。或在保存上下文 A 后实例化上下文 B。

查看关于 NSManagedObjectContext 的 mergeChangesFromContextDidSaveNotification 文档。

【讨论】:

我明白了。这解决了问题。所以关于这一切的主要问题是:如果保存一个上下文使得该上下文中的更改保存在实际的持久存储中......为什么任何其他上下文在从任何不同的上下文中获取时都看不到这些更改?我说保存上下文会保留磁盘上的更改是错误的吗?如果我没有错,为什么任何其他上下文都不能在提取过程中看到那些持久的更改?我认为任何上下文都会一直查看持久存储...谢谢 NSManagedObjectContext 是存储在内存中的表示,因为加载到上下文中的数据会有效地缓存在内存中,因此如果您从单独的上下文中保存,则会过时。每次调用 -save: 时,这些更改都会写入磁盘,但是它们在已经从磁盘加载对象的上下文中不可见,直到它们被合并,或者你在上下文上调用 -reset。 太棒了。那是我当时的误解。现在有道理了,为什么注册通知可以解决问题。谢谢

以上是关于核心数据获取...为啥在将托管对象插入上下文 A 并保存上下文 A 后,不使用上下文 B 获取托管对象?的主要内容,如果未能解决你的问题,请参考以下文章

初始化托管对象而不插入托管对象上下文时,核心数据对象属性为零

核心数据和托管对象上下文

核心数据单一托管对象上下文和两个线程

核心数据:我的托管对象上的托管对象上下文为零

在托管对象上下文中添加 NSSortDescriptor 以获取请求?

为啥核心数据托管对象中的 NSDate 转换为 NSTimeInterval?