【问题标题】:Keypath error with Core Data SUBQUERY and NSFetchedResultsControllerCore Data SUBQUERY 和 NSFetchedResultsController 的 Keypath 错误
【发布时间】:2012-06-01 12:22:37
【问题描述】:

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

我有一个核心数据堆栈,其中包含三个类 XClassYClassZClassXClassYClass 具有一对多的关系。 YClassZClass 是一对多的关系。

使用NSFetchedResultsController 的实例,我试图获取至少有1 个YClass 至少有1 个ZClassXClass 的所有实例。

我的谓词定义如下:

// ...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'

在其他地方,我使用谓词 [NSPredicate predicateWithFormat:@"zObjects.@count &gt; 0"]; 成功获取了 YObject 实例

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

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

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

    不好:SUBQUERY(yObjects, $y, $y.zObjects == NIL) &gt; 0

    好的:SUBQUERY(yObjects, $y, SUBQUERY($y.zObjects, $z, $z == NIL) &gt; 0) &gt; 0

    以下表达式会将所有非 nil 对象添加到 SUBQUERY 返回的过滤集合中。换句话说,返回的集合将包含所有具有 ZClass 实例的 XClass 实例。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2011-05-18
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多