在 CoreData 中获取实体时,实体关系是不是也会加载到内存中?

Posted

技术标签:

【中文标题】在 CoreData 中获取实体时,实体关系是不是也会加载到内存中?【英文标题】:Does entity relation also get loaded into memory when entity gets fetched in CoreData?在 CoreData 中获取实体时,实体关系是否也会加载到内存中? 【发布时间】:2013-12-11 03:51:15 【问题描述】:

我正在开发一款允许用户从照片中创作小漫画的应用。我已经实现了CoreData,因此用户可以保存和重新编辑他们的漫画。我创建了两个实体:ComicInfoComicDetails,它们彼此之间存在关系(我是通过阅读 Ray Wenderlich 教程做到的)。所以当用户保存漫画时,我创建一个新的ComicInfoNSManagedObject,在其中存储名称和缩略图,然后我创建一个ComicDetailsNSManagedObject,在其中存储各种属性,然后我存储@987654328 @ 在ComicInfo 中并保存。

我创建了一个 UITableView,它显示所有 ComicInfo 对象的缩略图和名称,以允许用户选择一个,以便他们可以编辑漫画。

我想知道的是,为什么我把它分成两个实体,而不是把它们合二为一?我假设当我从CoreData 加载所有ComicInfos 时,ComicDetails 也将被加载到内存中,还是我错了?在一个完美的世界中,我希望它在UITableView 启动时只加载ComicInfos,然后当用户选择其中一行时,相关的ComicDetails 将被加载到内存中。这不是这里发生的事情吗?

【问题讨论】:

“我将 ComicDetails 存储在 ComicInfo...” 你的意思是你们有关系吗?如果是这样,您可以编辑问题来描述它吗?如果不是,你能描述一下你的意思吗? @TomHarrington - 是的,我在 xcdatamodeld 文件中指出的两者之间存在关系。当我创建 ComicInfo 和 ComicDetails 时,我也在做 ComicInfo.details = ComicDetails。刚刚意识到我没有设置comicDetails.info(不知道它是否有所作为)。 你也不需要设置反比关系(comicDetails.info)。 我认为您可以告诉fetch 您要检索哪些属性。但是,看不到您从拥有两个对象中获得了太多好处。 【参考方案1】:

拥有两个实体的原因是为了获得您希望的行为。通常,当您进行核心数据提取时,只有您请求的实体类型的实例才会加载到内存中。相关对象不会立即加载。相反,Core Data 会按需自动加载它们。

在您的情况下,如果您获取 ComicInfos,则只有 ComicInfos 被加载。但是,如果您获取其中一个对象并访问其details 属性,则会自动加载相关的ComicDetails 实例,而无需进行另一次获取。仅当您请求相关对象时才会加载它们。所以,你得到了你想要的行为。

如果您想覆盖此行为,可以使用setRelationshipKeyPathsForPrefetching: 强制NSFetchRequest 不仅加载您实际获取的对象,还加载特定的相关对象。

【讨论】:

谢谢。我认为这可能是正在发生的事情,但不确定。

以上是关于在 CoreData 中获取实体时,实体关系是不是也会加载到内存中?的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 获取实体

CoreData 困境:没有反向关系的实体

从 CoreData 关系中获取错误实体的对象

如何使用CoreData获取相关实体的对象?

一旦实体更新,Coredata 关系就会中断

CoreData - 在实体上有许多关系时的性能