2

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

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

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

以下是我当前的代码:

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

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

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

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

非常感谢!

4

2 回答 2

0

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

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

NSSet *only_Ys = [my_Ys filteredSetUsingPredicate:pred];
于 2013-04-09T14:36:35.283 回答
0

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

X <--->> Y <---> Z

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

  • 托管对象故障是适当类的实例,但其持久变量尚未初始化。
  • 关系故障是表示关系的集合类的子类。

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

有关更多信息,请查看 Apple 的核心数据编程指南的故障和唯一部分

于 2013-04-09T15:17:40.113 回答