从核心数据获取请求中排除反向关系

时间:2012-12-11 18:32:13

标签: iphone objective-c ios cocoa core-data

父对象与自己的孩子有很多关系。

Core Data Model

当我获取对象的所有子节点时,请求也通过反向关系返回父对象。

在获取请求中是否有一种方法可以排除反向关系,以便结果只包含子对象?

到目前为止,我的解决方案是在Object的自定义NSManagedObject类中实现一个方法,该方法返回子元素的过滤数组。

-(NSArray *)getChildrenOfObjectWithoutParent:(int)parentId
{
    NSArray *results = [[self.children allObjects] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(objId != %d)", parentId]];
    return results;
}

1 个答案:

答案 0 :(得分:2)

更清洁的解决方案是建立两种关系:

  • children to-many 对象到自身
  • 的关系
  • parent作为 to 对象到自身的关系

并将它们定义为互逆关系。

然后self.children准确地给出了子对象,没有任何问题或技巧。

enter image description here

(我假设你的描述中一个对象只能有一个父对象。如果一个对象有多个父对象,你可以将parent定义为 to-many 关系。)

此设置的另一个优点是您可以为关系定义不同的核心数据“删除规则”。

一个有用的例子是:

  • 删除children关系的规则“Cascade”和
  • 删除parent关系的规则“Nullify”。

效果是如果删除一个对象,它的所有子对象也会自动删除,并从父对象子对象中删除该对象。