NSP предикат с логическим значением не сравнивает логическое значение с NO - PullRequest
15 голосов
/ 27 августа 2011

Я использую CoreData, и у моей сущности есть логическое свойство isReward.

Я пытаюсь извлечь сущность и отфильтровать все результаты, где isReward == YES.

isReward != YES не работает.

isReward == NO не работает.

NSPredicate predicateWithFormat:"isReward != %@", [NSNumber numberWithBool:YES]] не работает

isReward == Nil работает.

Что дает?

1 Ответ

26 голосов
/ 27 августа 2011

Полагаю, вы захотите:

[NSPredicate predicateWithFormat:@"isReward = NO OR isReward = nil"]

(Согласно документации Apple здесь , прямое сравнение с NO должно быть действительным.)

В целом, при сравнении с null / nil в терминах данных, null == false оценивается как false , а null != false оценивает false. Сравнение с null обычно оценивается как false, за исключением случаев проверки на IS NULL.

Я бы также сказал, что индексирование в целом дает лучшие результаты при поиске равенства, а не неравенства. Это довольно просто изменить в вашем случае (хотя я не уверен, что это будет иметь значение для Core Data в целом).

Кроме того, если вы хотите, чтобы оно всегда было YES или NO (и пропустите проверку для nil), вам необходимо явно установить значение по умолчанию NO.

Однако, вы можете иметь некоторую семантическую ценность, оставляя его nil, пока он не будет явно установлен вашим приложением. Это действительно зависит от того, что вы пытаетесь сделать.

...