获取对象是不是也获取核心数据中的关系对象

Posted

技术标签:

【中文标题】获取对象是不是也获取核心数据中的关系对象【英文标题】:Does fetching object also fetches relationship objects in core data获取对象是否也获取核心数据中的关系对象 【发布时间】:2013-02-27 12:50:28 【问题描述】:

我在核心数据中有一对多的关系 b/w 对象。 像 A==>>B(许多对象) 所以 A 与 B 对象具有一对多的关系。 我的问题是,当我获取 A 对象时,B 对象是否也被加载到内存中? 如果否,那么它们何时加载?当我访问关系?

【问题讨论】:

【参考方案1】:

在大多数情况下不会。这是 Core Data 中称为Faulting 的机制。当您请求尚未实现的对象(即加载到内存中)时,框架会在后台处理实现错误。

故障处理是透明的——您不必执行提取来发现故障。如果在某个阶段访问了故障对象的持久属性,那么 Core Data 会自动检索该对象的数据并初始化该对象(请参阅 NSManagedObject 类参考以获取不会导致故障触发的方法列表)。这个过程通常被称为触发故障。如果您向 Department 对象发送一条消息以获取它的名称,那么就会触发错误——在这种情况下,Core Data 会执行一次获取以检索所有对象的属性。

因此,在您的示例中,如果您加载 A,Core Data 将使 B 实例出错(即不将它们加载到内存中),当您实际尝试访问 B 时,它会意识到错误(即加载到内存中)。

相反,有时您已经在内存中加载了对象,而您想“卸载”它们。这叫做把对象变成故障。

您可以使用 refreshObject:mergeChanges: 方法将已实现的对象变为故障。如果您将 NO 作为 mergeChanges 参数传递,则必须确保该对象的关系没有更改。如果存在,然后您保存上下文,则会将引用完整性问题引入持久存储。

【讨论】:

非常感谢,正是我想要的! 另外:您可以通过设置request.relationshipKeyPathsForPrefetching = @[@"B"]; 来关闭NSFetchRequest 中的Faulting。见:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/… @flinth 这是link to the updated docs。您需要向下滚动到“减少故障开销”部分中的“预取”子部分。

以上是关于获取对象是不是也获取核心数据中的关系对象的主要内容,如果未能解决你的问题,请参考以下文章

获取核心数据对象,其中一对多关系包含集合中的所有对象

从核心数据获取请求中排除反向关系

核心数据:获取特定对象的多对多关系中的所有实体?

核心数据获取关系对象

在不获取现有对象的情况下创建核心数据关系

访问核心数据中的子对象时出现关系错误