【问题标题】:SUBQUERY in NSPredicate and NSInvalidArgumentExceptionNSPredicate 和 NSInvalidArgumentException 中的 SUBQUERY
【发布时间】:2012-04-05 22:24:20
【问题描述】:

我在 Core Data 中设置了以下模型。

Book has a to-many relationship, called toBookOrders, with OrderBook entity. The inverse is called toBook.
Book has a BOOL value property called isSync.

我设置了以下NSPredicate

NSEntityDescription* entityDescription = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:moc];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"];

通过这个谓词,我只需要获取尚未同步的书籍及其相关顺序。

这是我收到的错误。

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'无法解析格式 字符串“isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)”

有什么想法吗?提前谢谢你。

【问题讨论】:

    标签: ios core-data nspredicate one-to-many


    【解决方案1】:

    这是你问题的症结所在:

    @"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF)"
    

    如果您按照 Scott 的建议将其拆分为两个子谓词,您将得到:

    • isSync == 0
    • SUBQUERY(toBookOrders, $x, $x.toBook == SELF)

    问题是每个SUBQUERY 不返回真或假,作为谓词必须。它返回一个集合(一个数组),而一个数组与真假不是一回事。因此,当您创建谓词时,您会收到错误格式无效的错误消息,因为AND 之后的内容不是谓词。这只是一个表达式。

    可能想要:

    @"isSync == 0 AND SUBQUERY(toBookOrders, $x, $x.toBook == SELF).@count > 0"
    

    这将为您提供一个谓词来查找所有 isSync 为假的书籍,并且该书籍的 OrderBooks 中至少有一个是该书籍。

    【讨论】:

    • 非常感谢戴夫。很好的解释。我也可以用 ANY 达到相同的结果吗?谢谢。
    • @Flex_Addicted 是的,你可以这样做...AND ANY toBookOrders.toBook == SELF
    • 我爱你
    • 谢谢。我为此苦苦挣扎了一段时间。
    • 感谢 Dave 的完美回答 :)
    【解决方案2】:

    isSync == 0SUBQUERY 分离为单独的NSPredicates,将它们添加到NSArray,然后使用[NSCompoundPredicate andPredicateWithSubpredicates:array] 将它们合并为一个传递给您的NSFetchSpecification

    【讨论】:

    • 谢谢。问题仍然存在。也许在子查询中不能使用 SELF 。谢谢。
    • 这是我使用它的方式:[NSPredicate predicateWithFormat:@"SUBQUERY(childItems, $child, $child.columnName IN %@).@count != 0", arrayOfThingsToMatchOn]。我认为自我应该是隐含的。
    • -1 这与在谓词格式中使用AND 没有什么不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多