NSPredicate with boolean не сравнивает логическое значение с NO

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

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

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

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

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

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

Что дает?

Ответы

Ответ 1

Я предполагаю, что вам нужно:

[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, пока оно явно не будет установлено вашим приложением. Это действительно зависит от того, что вы пытаетесь сделать.