【问题标题】:How to avoid fetching the sub entities in a relationship如何避免获取关系中的子实体
【发布时间】:2013-04-09 13:45:13
【问题描述】:

假设我有 3 个实体,X、Y、Z。

X 具有指向 Y 的一对多关系“Ys”,Z 是 Y 的子实体。

在我的情况下,我想获取给定 X 的所有“Y”,但我不想要任何 Z。

以下是我当前的代码:

X *anX;
NSSet *my_Ys = [anX valueForKey:@"Ys"];

但是,我发现它确实获取了所有 Z,与集合 my_Ys 中的 Y 混合,这不是我想要的。

但是我还没有想出专业的方法来避免这种情况,除了检查my_Ys中所有对象的实体名称以便逐个过滤集合,我认为这有点慢。

那么任何人都可以提供一些帮助吗?我真的很感激!

非常感谢!

【问题讨论】:

    标签: ios core-data entity relationship fetch


    【解决方案1】:

    如果您使用获取请求来获取 Ys,您可以将“includesSubentities”设置为 FALSE。当您通过与 X 的关系检索 Y 时,您不能这样做,但您应该能够通过比较 Y 实例的类对返回的集合使用谓词:

    NSPredicate *pred = [NSPredicate predicateWithFormat: @"class == %@", [Y class]];
    
    NSSet *only_Ys = [my_Ys filteredSetUsingPredicate:pred];
    

    【讨论】:

    • 不需要实例化一个对象来获得它的类。你可以在这里说[Y class]
    • @SeamusCampbell 是的,我的原始答案使用了“[Y class]”,但是当我使用 NSString 进行快速测试时,它只适用于一个实例,这对我来说毫无意义。刚刚使用 NSManagedObject 进行了测试,它可以工作,所以我编辑了我的答案。谢谢。
    • NSString 行为是由于将NSString 实现为类集群;以及您要求班级平等而不是班级成员资格这一事实。
    • 对,这解释了为什么我尝试使用 'isKindOfClass' 而不是 'isMemberOfClass'。
    • 谢谢,这有帮助!而且我敢打赌它比我的 DIY 过滤方法更好。
    【解决方案2】:

    所以,你的对象图看起来像这样

    X > Y Z

    Core Data 的好处是您通常不必担心修剪对象图,因为它会通过一种称为故障的机制为您智能地管理它。故障减少了应用程序消耗的内存量。故障是表示尚未完全实现的托管对象的占位符对象,或表示关系的集合对象:

    • 托管对象故障是相应类的实例,但 它的持久变量尚未初始化。
    • 关系错误是集合类的子类, 表示关系。

    故障处理是透明的——您不必执行提取来发现故障。如果在某个阶段访问了故障对象的持久属性,Core Data 会自动检索该对象的数据并初始化该对象。

    有关更多信息,请查看 Apple 的核心数据编程指南Faulting and Uniquing section

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 2019-08-09
      • 2021-07-21
      • 2014-03-05
      • 2023-03-03
      相关资源
      最近更新 更多