2016-10-11 11 views
0

На 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"]; 

Что я здесь отсутствует?

+1

Я думаю, что проблема связана скорее с ограничениями 'CKQuery', чем' NSPredicate', что объясняет, почему вы можете использовать 'nil' в' NSArray' пользовательских объектов, например ... Это неясно сказано, но из Doc 'CKQuery':' Создание ваших предикатов Объект NSPredicate определяет логические условия для определения того, соответствует ли запись запросу. Класс CKQuery поддерживает только подмножество поведения предикатов, предлагаемое полным классом NSPredicate. ' – Larme

+0

@ Larme Спасибо, я просто перечитал документы ckquery более близко. Я ранее пропустил бит о поддержке только подмножества, если nspredicate. Если вы опубликуете это как ответ, я соглашусь и, возможно, помогу следующему человеку, который не читал документы близко. – Thunk

ответ

2

Согласно CKQuery doc, кажется, что CKQuery не позволяет nil в предикатах (в iOS 10 на момент написания ответа).

Построение ваших Предикаты
объект NSPredicate определяет логические условия для определения записи, является ли матч для запроса. Класс CKQuery поддерживает только подмножество поведения предиката , предлагаемого полным классом NSPredicate.

Ваше NSPredicate строительство не кажется неправильным, так как это может работать на NSArray из пользовательских объектов, например.

+0

Итак, есть ли другой способ проверить nil при построении предиката с использованием CKQuery? –

 Смежные вопросы

  • Нет связанных вопросов^_^