在 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
,因此用户可以保存和重新编辑他们的漫画。我创建了两个实体:ComicInfo
和 ComicDetails
,它们彼此之间存在关系(我是通过阅读 Ray Wenderlich 教程做到的)。所以当用户保存漫画时,我创建一个新的ComicInfo
NSManagedObject
,在其中存储名称和缩略图,然后我创建一个ComicDetails
NSManagedObject
,在其中存储各种属性,然后我存储@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 中获取实体时,实体关系是不是也会加载到内存中?的主要内容,如果未能解决你的问题,请参考以下文章