使用NSPredicate搜索NIL的CKQuery总是抛出一个无效表达式错误

时间:2016-10-11 05:20:09

标签: ios objective-c nspredicate cloudkit

在iOS 10.0.1和Xcode 8.0上,我有CKQuery成功返回各种条件的数据(BEGINSWITH并且等于某些字符串等)。现在我正在寻找其中一个字段中具有空值的记录。

根据Apple's Docs,加上How do I set up a NSPredicate to look for objects that have a nil attributeNSPredicate with boolean is not comparing a boolean to NO,以下语法应搜索nil值:

NSPredicate *searchConditions = [NSPredicate predicateWithFormat:@"joiner = nil "];
CKQuery *query = [[CKQuery alloc] initWithRecordType:@"availableURLs"
                                           predicate:searchConditions];

当我设置断点并检查searchConditions时,它会计算为joiner == nil。当我尝试使用它时,第二行引发异常:

Terminating app due to uncaught exception 'CKException', reason: 
'Invalid predicate: joiner == nil (Error Domain=CKErrorDomain Code=12
"Invalid right expression in <joiner == nil>: <nil> is not a function expression" 
UserInfo={ck_isComparisonError=true, 
NSLocalizedDescription=Invalid right expression in <joiner == nil>: <nil> is not a function expression, 
NSUnderlyingError=0x1706516d0 {Error Domain=CKErrorDomain Code=12 "<nil> is not a function expression" 
UserInfo={NSLocalizedDescription=<nil> is not a function expression, ck_isComparisonError=true}}})'

我已尝试过===nilNilNILNULL的所有组合。全部评估为joiner == nil并抛出异常。

在第一个关联问题中,OP使用predicateWithSubstitutionVariables替换[NSNull null]。我也试过了,但它再次评估joiner == nil并抛出相同的异常。

Apple Docs有一个专门搜索nil的部分,我看不出他们的例子与我的不同:

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

根据CKQuery doc,似乎CKQuery在谓词中不允许nil(在撰写答案时在iOS 10中)。

  

构建谓词
NSPredicate对象定义用于确定记录是否与a匹配的逻辑条件   查询。 CKQuery类仅支持谓词的子集   完整的NSPredicate课程提供的行为。

您的NSPredicate构建似乎没有错,因为它可能适用于NSArray自定义对象。