【问题标题】:How to fetch an entity without its to-many relationships如何获取没有多对多关系的实体
【发布时间】:2013-01-22 12:06:38
【问题描述】:

我有一个模型,其中有一个名为“类别”的实体。此类别具有称为“产品”的一对多关系。如何设置获取请求以仅获取没有产品的类别实体?

【问题讨论】:

    标签: ios core-data nsfetchrequest


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-26
      • 2010-12-04
      • 2014-05-09
      相关资源
      最近更新 更多