Ответ 1
Я думаю, что это проблема чувствительности к регистру. Вы можете использовать "nil" или "NULL", но не "NIL". Это отлично работает для меня:
NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];
У меня есть ManagedObject class
, а один из членов класса - NSDate
. Я хотел бы отобразить все объекты класса, для которых дата НЕ установлена. Я попытался использовать предикат вроде этого:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];
Но я все еще получаю объекты, где установлен date
. Каков правильный способ создания предиката для этого?
Я думаю, что это проблема чувствительности к регистру. Вы можете использовать "nil" или "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
), чтобы любые обновления могли быть сохранены в постоянном хранилище перед выполнением запроса на выборку.