На iOS 10.0.1 и Xcode 8.0 у меня есть CKQuery
, который успешно возвращает данные для различных условий (BEGINSWITH
и равен определенным строкам и т. Д.). Теперь я ищу специально для записей с нулевым значением в одном из полей.CKQuery, использующий NSPredicate для поиска NIL, всегда выдает ошибку недопустимого выражения
Согласно Apple's Docs, плюс How do I set up a NSPredicate to look for objects that have a nil attribute и NSPredicate with boolean is not comparing a boolean to NO, следующий синтаксис должен искать нулевые значения:
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}}})'
Я пробовал все комбинации =
, ==
, nil
, Nil
, NIL
и NULL
. Все оцениваются до joiner == nil
и выдают исключение.
В первом связанном вопросе ОП использует predicateWithSubstitutionVariables
для замены в [NSNull null]
. Я тоже это пробовал, но он снова оценил joiner == nil
и бросил то же исключение.
яблоке Docs есть раздел specifcally на поиске ноль, и я не могу видеть, как их пример отличается от моего:
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
Что я здесь отсутствует?
Я думаю, что проблема связана скорее с ограничениями 'CKQuery', чем' NSPredicate', что объясняет, почему вы можете использовать 'nil' в' NSArray' пользовательских объектов, например ... Это неясно сказано, но из Doc 'CKQuery':' Создание ваших предикатов Объект NSPredicate определяет логические условия для определения того, соответствует ли запись запросу. Класс CKQuery поддерживает только подмножество поведения предикатов, предлагаемое полным классом NSPredicate. ' – Larme
@ Larme Спасибо, я просто перечитал документы ckquery более близко. Я ранее пропустил бит о поддержке только подмножества, если nspredicate. Если вы опубликуете это как ответ, я соглашусь и, возможно, помогу следующему человеку, который не читал документы близко. – Thunk