如何获取没有多对多关系的实体

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 是从ProductsCategory 的反比关系,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

【讨论】:

以上是关于如何获取没有多对多关系的实体的主要内容,如果未能解决你的问题,请参考以下文章

如何在 IOS Swift 中获取核心数据中的多对多关系?

ObjectionJs 获取具有多对多关系的实体

iPhone:无法对多对关系进行 NSSortDescriptor。如何排序?

MVC 多对多仅在代码中首先获取具有某种类型的实体

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

EF Code First 没有实体的多对多关系