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

Posted

技术标签:

【中文标题】核心数据:以一对多的关系获取实体的获取请求【英文标题】:Core Data: fetch request for fetching entities in a one-many-one relationship 【发布时间】:2012-10-09 22:26:28 【问题描述】:

假设我有 3 个实体 GrandparentParentChild

Grandparent - Parent 是一对多的关系

Parent - Child 是多对一的关系

Child 有一个age 属性

我的目标是获取Parent 的所有Child 实体,其中Parent.grandparent 是某个Grandparent。另外,我想按age 对获取的结果进行排序。我知道我可以通过多个步骤来做到这一点,但我的问题是:我怎样才能在一个 fetch 请求中完成这个?

编辑:也许这张图会比上面的描述清楚一点。

【问题讨论】:

【参考方案1】:

我假设变量和关系名称,将它们更改为您在代码和模型中命名的任何名称。

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Child" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:@"parent.grandparent == %@", grandParentObject];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES]];

这应该可行。我习惯了代码完成,我没有在 Xcode 中输入这个,所以方法名称可能有点偏离,但你明白了。

【讨论】:

如果省略谓词,你会得到什么吗?如果是这样,请检查您的 grandParentObject 并确保它是至少一个 Child 的 Parent 对象的一部分。 省略谓词,我确实得到了一些东西。你认为这个问题与 Child 的 Parent 对象的 NSSet 有关吗? (孩子与父母是一对多的关系) 对不起,我看错了。所以一个孩子可以有多个父母,但一个父母只能有一个孩子,对吗?【参考方案2】:

我很幸运,找到了这个答案 NSPredicate acting strange in NSFetchedResultsController

这个问题的措辞不同,这就是我花了一段时间才找到它的原因。基本上,我正在寻找的谓词是以下格式:

[NSPredicate predicateWithFormat:@"SUBQUERY(parent, $x, $x.grandparent == %@).@count != 0", grandParent];

【讨论】:

以上是关于核心数据:以一对多的关系获取实体的获取请求的主要内容,如果未能解决你的问题,请参考以下文章

快速获取具有一对多关系的核心数据

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

获取核心数据中一对多关系的计数

IOS:通过一对多关系获取核心数据

如何在核心数据中以一对多关系链接现有值?

获取一对多的核心数据关系第一次返回正确的对象,但其他时候返回空集