核心数据-嵌套对象/ NSSet上的NSPredicate可以在NSFetchRequest期间过滤结果

我想要一个简单的谓词,让我返回所有模式= 0且组中注册方式为0的组

准确地说,我需要一个谓词来访问嵌套对象的属性.
谓词类似:

[NSPredicate predicateWithFormat:@"mode = 0 AND enrollments.Enrollment.mode = 0"]

上述谓词是错误的,显然是行不通的.

编辑:

我也给出了以下谓词,但未成功.

[NSPredicate predicateWithFormat:@"mode = 0 AND ALL ( SUBQUERY(enrollments,$varEnrollment,$varEnrollment.mode = 0))"]

我需要包含活动的所有组(group.mode = 0)和活动的所有注册人的结果(enrolles.mode = 0)
但对我而言,此谓词不起作用.

最佳答案
根据您的问题和评论,我想您想要

[NSPredicate predicateWithFormat:@"mode = 0 AND (ALL enrollments.mode = 0)"]

UPDATE

似乎所有聚合均不起作用.它抛出

'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'

正如@yunas注意到的.以前也已经注意到这一点,例如

> Core Data, NSPredicate and to-many key
> Crash using Aggregate Operation: “ALL” in a Core Data iOS Application

另一方面,ANY聚合也可以正常工作.因此,作为一种替代方法,可以用等效的ANY表达式替换ALL:

[NSPredicate predicateWithFormat:@"mode = 0 AND NOT(ANY enrollments.mode != 0)"];

这实际上有效(我已经测试过)!

更新2

在讨论过程中,很明显,尤纳斯想为模式= 0的每个组显示一张表,并且在表行内显示模式= 0的该组的所有登记表.

第一个解决方案(可能更好):首先使用上述方法找到所有可允许的组.对于每行(在cellForRowAtIndexPath:中),过滤该组的注册并绘制单元格.

第二种解决方案:获取所有注册并按组对它们进行排序.这仅需要一个获取请求,但是结果不适合用作表视图数据源.提取请求如下所示:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Enrollment"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"mode = 0 AND group.mode = 0"];
request.predicate = predicate;
NSSortDescriptor *sort1 = [NSSortDescriptor sortDescriptorWithKey:@"group.name" ascending:YES];
NSSortDescriptor *sort2 = [NSSortDescriptor sortDescriptorWithKey:@"share" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObjects:sort1, sort2, nil];

转载注明原文:核心数据-嵌套对象/ NSSet上的NSPredicate可以在NSFetchRequest期间过滤结果 - 代码日志