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

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

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

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

4 ответа

Решение

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

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

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

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

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html

следующий код должен работать

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

Существует очень раздражающее поведение запросов на выборку, как описано в Apple:

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

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

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

Другие вопросы по тегам