Как настроить 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"]];
следующий код должен работать
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
Существует очень раздражающее поведение запросов на выборку, как описано в Apple:
Если объект в контексте был изменен, предикат оценивается по его измененному состоянию, а не по текущему состоянию в постоянном хранилище. Следовательно, если объект в контексте был изменен так, что он удовлетворяет критериям запроса на выборку, запрос извлекает его, даже если изменения не были сохранены в хранилище, а значения в хранилище таковы, что он не удовлетворяет критериям. И наоборот, если объект в контексте был изменен так, что он не соответствует запросу на выборку, запрос на выборку не будет извлекать его, даже если версия в хранилище совпадает.
Возможно, вы очищаете дату в другом месте, и запрос на выборку включает результаты, где дата nil
в памяти, но все еще установлен на диске (в постоянном хранилище), и поэтому, когда объект выходит из строя, он загружает объект с установленной датой.
Мой единственный совет - координировать доступ к контексту управляемого объекта (скажем, на NSOperationQueue
) таким образом, что любые обновления могут быть сохранены в постоянном хранилище перед выполнением запроса на выборку.