如何避免在关系中获取子实体

时间:2013-04-09 13:45:13

标签: ios core-data entity relationship fetch

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

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

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

以下是我目前的代码:

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

然而,我发现它确实获取了所有的Zs,并在my_Ys集中与Ys混合,这不是我想要的。

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

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

非常感谢!

2 个答案:

答案 0 :(得分:0)

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

NSPredicate *pred = [NSPredicate predicateWithFormat: @"class == %@", [Y class]];

NSSet *only_Ys = [my_Ys filteredSetUsingPredicate:pred];

答案 1 :(得分:0)

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

X< --->> Y< ---> ž

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

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

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

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