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

Posted

技术标签:

【中文标题】从核心数据获取请求中排除反向关系【英文标题】:Exclude Inverse Relationship from Core Data Fetch Request 【发布时间】:2012-12-11 18:32:13 【问题描述】:

父对象与它的自身和子对象具有多对多的关系。

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

在获取请求中是否有办法排除反向关系,以便结果仅包含子对象?

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

-(NSArray *)getChildrenOfObjectWithoutParent:(int)parentId

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

【问题讨论】:

【参考方案1】:

更简洁的解决方案是建立两个关系:

children 作为从 Object 到自身的 to-many 关系, parent 作为从 Object 到自身的 to-one 关系

并将这些定义为相互的反向关系。

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

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

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

一个有用的例子是:

删除children 关系的“级联”规则,并 删除parent 关系的规则“Nullify”。

效果是,如果一个对象被删除,其所有子对象也被自动删除,并且该对象从父对象children中移除。

【讨论】:

效果很好,谢谢!额外的好处;我正在使用这个模型进行分层导航,我之前保留了一个 parentFolderStack 属性以方便向后导航,现在我可以只获取父关系。再次感谢。

以上是关于从核心数据获取请求中排除反向关系的主要内容,如果未能解决你的问题,请参考以下文章

iPhone核心数据得到孙子

关系属性的核心数据获取请求

核心数据 - 以一对多关系访问实例与获取请求?

核心数据:以一对多的关系获取实体的获取请求

从获取中排除属性/字段 - 核心数据

获取“最新”单个实体的最简单 Fetch 请求 - 核心数据