从你的问题和评论我guess你要的那个
[NSPredicate predicateWithFormat:@"mode = 0 AND (ALL enrollments.mode = 0)"]
UPDATE
看来 ALL 聚合不起作用。它抛出
'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'
正如@yunas 注意到的。之前也注意到了这一点,例如
- 核心数据、NSPredicate 和对多键
- 使用聚合操作崩溃:核心数据 iOS 应用程序中的“ALL”
另一方面,ANY 聚合工作得很好。所以作为一个解决方法,可以将 ALL 替换为等效的 ANY 表达式:
[NSPredicate predicateWithFormat:@"mode = 0 AND NOT(ANY enrollments.mode != 0)"];
这确实有效(我已经测试过)!
UPDATE 2
在讨论过程中,很明显 yunas 希望显示一个表格,其中每个模式 = 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];