Arhn - архитектура программирования

NSPredicate для логического значения

У меня есть логический атрибут для объекта, и сгенерированный для него код:

@property (nonatomic, retain) NSNumber * countdownMode;
@dynamic countdownMode;

Сущность сохраняется с помощью:

score.countdownMode = @(YES);

fetchRequest имеет следующий предикат:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == YES"];

По какой-то причине выборка никогда ничего не возвращает. Есть идеи? Когда предикат удаляется, строки извлекаются. В отладчике я вижу, что countdownMode равен 1. Я также пробовал это безуспешно:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == %@", @YES];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == %d", YES];

Кажется, что это должно быть просто, но не возвращает никаких результатов. Помощь приветствуется.


  • Можете ли вы попробовать изменить NSNumber на NSInteger или int16_t и посмотреть, работает ли сравнение предиката? 27.01.2015

Ответы:


1

Все полностью эквивалентны.

@"count = 1"
@"count = true"
@"count = YES"
@"count = %@", @YES
@"count = %@", [NSNumber numberWithBool:YES]
// plus all these versions with "=="

Ни один из них не является предпочтительным, за исключением соображений краткости и ясности. Результирующий вызов базы данных SQLite будет точно таким же, поэтому нет абсолютно никакой разницы в эффекте, безопасности или производительности.

Взгляните, в базе данных SQLite хранится «1». (Это деталь реализации, которая может измениться, поэтому не полагайтесь на нее. Однако для всех практических целей это не имеет значения).

Кроме того, @YES и [NSNumber numberWithBool:YES] абсолютно одинаковы. Первый представляет собой новую форму буквенной записи, представленную в «Modern Objective C».

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

27.01.2015

2

Логическое значение не рекомендуется явно сравнивать с YES. Таким образом, попробуйте этот случай:

BOOL yes = YES;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countDownMode == %@", [NSNumber numberWithBool:yes]];
27.01.2015
  • разве это не то же самое, что @YES? 27.01.2015
  • Нет, это экземпляр класса NSNumber, который также используется NSManagedObject для обработки чисел и логических значений включительно. Я не уверен полностью, но я советую вам попробовать. 27.01.2015
  • Почти уверен, что они одинаковы, ОП уже пробовал это: clang.llvm. org/docs/ObjectiveCLiterals.html#nsnumber-literals 27.01.2015
  • Хорошо, попробуй вот это: [[NSNumber numberWithBool: YES] description] 27.01.2015
  • @YES - это просто буквальный синтаксис для [NSNumber numberWithBool:YES], они идентичны - указатели NSNumber. YES является скаляром типа BOOL. [[NSNumber numberWithBool: YES] описание] — это строка. [NSPredicate predicateWithFormat:@"countDownMode == %@", @YES]; является допустимым синтаксисом предиката, предполагая, что countDownMode является логическим. 28.01.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..