NSPredicate在嵌套对象/ NSSet上过滤NSFetchRequest期间的结果

yun*_*nas 0 core-data filter nested-set-model nspredicate nsfetchrequest

我想要一个简单的谓词,它返回所有具有mode = 0的组和组中的注册模式= 0

确切地说,我需要一个谓词来访问嵌套对象属性.不知何故,谓词如下:

[NSPredicate predicateWithFormat:@"mode = 0 AND enrollments.Enrollment.mode = 0"]
Run Code Online (Sandbox Code Playgroud)

上面的谓词是错误的,显然不起作用.

编辑:

我也给了下面的谓词,但是没有成功.

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

我需要包含所有活动组的结果(group.mode = 0)和所有活动的enrollee(enrolles.mode = 0),但对我来说这个谓词不起作用.

Mar*_*n R 6

从你的问题和我你想要的评论

[NSPredicate predicateWithFormat:@"mode = 0 AND (ALL enrollments.mode = 0)"]
Run Code Online (Sandbox Code Playgroud)

UPDATE

似乎ALL聚合不起作用.它抛出

'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'
Run Code Online (Sandbox Code Playgroud)

正如@yunas注意到的那样.这也已经被注意到,例如

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

[NSPredicate predicateWithFormat:@"mode = 0 AND NOT(ANY enrollments.mode != 0)"];
Run Code Online (Sandbox Code Playgroud)

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

更新2

在讨论过程中,很明显yunas想要为mode = 0的每个组显示一行表,并且在表行中显示mode = 0的所有组的注册.

第一个解决方案(可能是更好的解决方案):首先使用上面给出的方法查找所有可接受的组.对于每一行(in 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];
Run Code Online (Sandbox Code Playgroud)