iPhone 核心数据 NSFetchRequest
Posted
技术标签:
【中文标题】iPhone 核心数据 NSFetchRequest【英文标题】:iPhone Core Data NSFetchRequest 【发布时间】:2012-05-31 21:02:22 【问题描述】:我对这项技术并不陌生,但有一件事让我很烦。 这是关于核心数据的。 假设我有这样的数据库模型:
人 房子 房子细节
表示双向关系和 一个人有很多房子,每个房子都有它的细节(无论如何,例如)。
现在在 Core Data 中,当我联系特定的人时,我会得到这个人以及所有关系(在客观方法参考中)直到“房屋详细信息”。
现在想象一下 db 模型更复杂,而 XCode 强制使用双向关系(仅通过警告,但仍然如此)。
我的问题是假设我是否根据 XCode 正确(双向)拥有所有关系, 有什么方法可以获取查询(来自上面的示例),我想在其中获取特定的人,但没有对房屋和房屋详细信息的引用。
我问这个问题的原因是因为据我所知这是不可能的,或者不是?另一个原因,主要原因是,当我们拥有具有双向关系的复杂数据库模型时,当我们只想接收没有任何数据的 Person 数据时,需要一些时间来获取所有这些数据(我们想要的但包含所有引用)与数据库模型的其他关系(参考)如此。基本上,这个想法是在我们仅要求 Person 数据时从结果中删除所有关系(根据示例)。
注意:这是我关于堆栈溢出的第一篇文章,所以不要活吃我 :)。 但是,如果这不可能实现我的要求,老实说,这是一个很大的痛苦,不能从开发人员的角度按照您的意愿管理数据。
如果我对这篇文章不清楚,请告诉我,我会解释这一点。
【问题讨论】:
要很好地使用堆栈溢出,“首选行为”是您接受一个回答您问题的答案。看起来你应该为下面沃伦的回答这样做。 【参考方案1】:默认情况下,核心数据会延迟加载关系,因此当您获取 person 对象时,只有在您开始引用它们时才会获取您的关系。
【讨论】:
【参考方案2】:当您获得实体的特定实例时,您不必担心 Core Data 将获取的确切内容。 Core Data 将为您管理内存问题。即使是获取实体的单个属性也可能是"faults"
,即 Core Data 会在需要时自动检索这些详细信息。您可以使用NSLog
语句检查这一点。除非需要,否则您的托管对象的许多详细信息将不可用。
因此,如果您有一个实体 Person
并获取一个实例 person
,其中包含 100 个房屋,每个房屋包含 50 个房屋详细信息,那么您将不会被所有这些数据堵塞您的记忆。
实际上,这就是 Core Data 的美妙之处。
【讨论】:
【参考方案3】:坏消息是,当您有双向关系时,这种关系会从两端保持,因此在您的情况下,您可以将一个人添加到房子或将房子添加到一个人,并且任何一方都会在他们的关系中拥有它设置(假设多对多关系)。这就是 Core Data 的工作方式。
好消息是,由于 CoreData 懒惰地获取信息的方式,这真的无关紧要。因此,如果您希望在不获取所有相关房屋的情况下找到一个人,这就是 CoreData 所做的。直到您真正希望在关系结束时加载对象,它们作为故障存在,也就是说最小的骨架引用。
NSLog 您获取的 Person 对象之一,如果它的相关房屋之前没有被获取,它们将被打印为最小引用。
【讨论】:
从现在开始我有 3 个没有仇恨的答案。很好。我回答你是因为你给了我我想听到的最复杂的答案。所以我对内存消耗的解释是错误的,很好。我很感谢所有的回应。但在我看来,如果喜欢在 dbms 系统上操作 db over ORM over Core Data 的人对数据有更多的控制权,那就太好了。感谢您的回答,这对我很有帮助,因为我一直想知道 Core Data 中的内存是如何管理的,我收到了一个答案。我写道,我不是新手,但要学的东西太多了。以上是关于iPhone 核心数据 NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章