抱歉,如果重复,则20分钟的搜索未得出确切的结果或解决方案。

我有一个包含三个类XClassYClassZClass的Core Data堆栈。 XClassYClass具有一对多关系。 YClassZClass具有一对多关系。

使用NSFetchedResultsController实例,我试图获取至少1个XClass具有至少1个YClassZClass实例。

我的谓词定义如下:

// ...stuff
NSFetchRequest * fetchRequest = [NSFetchRequest new];

NSEntityDescription * entity = [NSEntityDescription entityForName:NSStringFromClass([XClass class])
                                           inManagedObjectContext:managedObjectContext];
fetchRequest.entity = entity;

fetchRequest.predicate =
[NSPredicate predicateWithFormat:@"0 < SUBQUERY(yObjects, $y, $y.zObjects.@count > 0).@count"];

// ..instantiate NSFetchedResultsController and perform fetch

这将导致致命致命消息:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Keypath containing KVC aggregate where there shouldn't be one; failed to handle $y.zObjects.@count'
在其他地方,我已经成功地使用谓词YObject提取了[NSPredicate predicateWithFormat:@"zObjects.@count > 0"];实例

有人可以指出我做错了什么吗?非常感谢

最佳答案

当您在SUBQUERY的谓词字符串中使用集合运算符时,似乎NSPredicate对象会剧烈使用。似乎还无法对子查询谓词中的集合进行操作。除非变量表示谓词中的集合。

错误:SUBQUERY(yObjects, $y, $y.zObjects == NIL) > 0
OK:SUBQUERY(yObjects, $y, SUBQUERY($y.zObjects $z, $z == NIL) > 0) > 0
以下表达式会将所有非空对象添加到SUBQUERY返回的已过滤集合中。换句话说,返回的集合将包含带有ZClass实例化的XClass的所有实例。

[NSPredicate predicateWithFormat:@"yObjects.@count > 0 AND (SUBQUERY(yObjects, $y, (SUBQUERY($y.zObjects, $z, $z != NIL).@count > 0)).count > 0)"];

10-06 13:10