Core Data SUBQUERY和NSFetchedResultsController的Keypath错误

时间:2012-05-25 23:51:27

标签: iphone ios core-data

如果这是重复的道歉,20分钟的搜索没有产生这种确切的情况或解决方案。

我有一个包含三个类XClassYClassZClass的核心数据堆栈。 XClassYClass有一对多的关系。 YClassZClass有一对多的关系。

使用NSFetchedResultsController的实例,我正在尝试获取XClass的所有实例,其中至少有1 YClass至少有1 ZClass

我的谓词定义如下:

// ...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"];个实例

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

1 个答案:

答案 0 :(得分:3)

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

坏:SUBQUERY(yObjects, $y, $y.zObjects == NIL) > 0

好的: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)"];