如何获取没有多对多关系的实体
Posted
技术标签:
【中文标题】如何获取没有多对多关系的实体【英文标题】:How to fetch an entity without its to-many relationships 【发布时间】:2013-01-22 12:06:38 【问题描述】:我有一个模型,其中有一个名为“类别”的实体。此类别具有称为“产品”的一对多关系。如何设置获取请求以仅获取没有产品的类别实体?
【问题讨论】:
【参考方案1】:如果您查询Category
,产品元素将作为故障加载。这是 CoreData 的默认行为。
相反,如果你使用- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys
,你可以在请求执行时加载(pre-fetch)产品。
来自Core Data App
故障会减少您的应用程序消耗的内存量。一种 fault 是一个占位符对象,代表一个托管对象 尚未完全实现,或集合对象 表示关系:
托管对象错误是适当类的实例,但是 它的持久变量尚未初始化。关系故障 是集合类的子类,表示 关系。故障允许 Core Data 在 对象图。因为一个故障没有实现,一个托管对象故障 消耗更少的内存,并且与故障相关的托管对象不是 完全需要在内存中表示。
和
预取实际上是 批处理故障,在另一次提取后立即执行。这个想法 预取的背后是对未来需求的预期。当你 获取一些对象,有时你知道不久之后你也会 需要可能由故障表示的相关对象。为了避免 个别故障触发效率低下,您可以预取 目的地的对象。
编辑
如果您需要计算特定类别的产品数量,请使用- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error
使用如下请求:
NSFetchRequest* request = // set up a request for Products
[request setPredicate:[NSPredicate predicateWithFormat:@"toCategory == %@", currentCategory]];
// count for fetch request here...
其中toCategory
是从Products
到Category
的反比关系,currentCategory
是您拥有的类别。
【讨论】:
好的...只是为了澄清,这意味着如果我检查我的类别中的产品数量,它会显示相关产品的实际数量,但产品不会消耗任何内存,因为它们'还没有实例化?!一旦我想访问一个产品,Core Data 就会从持久存储中动态检索它? @ASP 是的,但您应该注意故障。如果您访问任何类别的属性,那么它将触发错误(Core Data 将进行往返并为您检索数据)。我添加了一个编辑。【参考方案2】:查看 NSFetchRequest 的文档
您可以设置“includeSubentities”和“returnsObjectsAsFaults”,以限制您的模型(产品)从核心数据返回的数据
https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSFetchRequest_Class/NSFetchRequest.html
【讨论】:
以上是关于如何获取没有多对多关系的实体的主要内容,如果未能解决你的问题,请参考以下文章