Как настроить NSPredicate для поиска объектов с атрибутом nil - программирование
Подтвердить что ты не робот

Как настроить NSPredicate для поиска объектов с атрибутом nil

У меня есть ManagedObject class, а один из членов класса - NSDate. Я хотел бы отобразить все объекты класса, для которых дата НЕ установлена. Я попытался использовать предикат вроде этого:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];

Но я все еще получаю объекты, где установлен date. Каков правильный способ создания предиката для этого?

4b9b3361

Ответ 1

Я думаю, что это проблема чувствительности к регистру. Вы можете использовать "nil" или "NULL", но не "NIL". Это отлично работает для меня:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];

Ответ 2

Выяснил это. Не удалось сделать это, используя предикат со строковым форматом, поэтому попробовал предикат с шаблоном, и он сработал. Здесь код, который дал мне объекты, у которых endDate установлен в NULL:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];

Ответ 4

Там очень неприятное поведение запросов на выборку, как описано в Apple:

Если объект в контексте был изменен, предикат оценивается по его измененному состоянию, а не по текущему состоянию в постоянном хранилище. Поэтому, если объект в контексте был изменен таким образом, что он удовлетворяет критериям запросов на выборку, запрос извлекает его, даже если изменения не были сохранены в хранилище, а значения в хранилище таковы, что они не соответствуют критериям. И наоборот, если объект в контексте был изменен таким образом, что он не соответствует запросу выборки, запрос выборки не будет извлекать его, даже если версия в хранилище не соответствует.

Возможно, вы очистите дату в другом месте, и запрос на выборку включает результаты, в которых дата nil в памяти, но все еще установлена ​​на диск (в постоянном хранилище), и поэтому, когда объект вызывает ошибку, он загружает объект с установленной датой.

Единственным моим советом было бы координировать доступ к контексту управляемого объекта (например, на NSOperationQueue), чтобы любые обновления могли быть сохранены в постоянном хранилище перед выполнением запроса на выборку.