Проверка основных данных NSPredicate для значения BOOL

В настоящее время у меня проблема с извлечением всех данных из db, в результате чего i.e 1 параметр TRUE.

Я использую NSPredicate, а ниже - пример кода

NSManagedObjectContext *context = managedObjectContext_;

if (!context) {
    // Handle the error.
    NSLog(@"ERROR CONTEXT IS NIL");
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_];

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"];

[request setPredicate:predicate];

Я попытался настроить predicatewithformat почти на все, но он по-прежнему не вытаскивает закладки, имеющие значение YES.

Я даже пробовал (@"bookmarked == %d",YES), но не с удачей. Я не хочу получать весь массив, а затем фильтровать его вручную, делая if(object.bookmarked == YES)..... blabla.

Я буду очень благодарен за помощь.

Большое спасибо.

Ответ 1

На основе документа Apple здесь мы можем использовать следующие два метода для сравнения Boolean:

NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@",[NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

Однако вышеприведенный предикат не может вынуть те, у которых есть пустой anAttribute. Чтобы обработать пустой атрибут, вам понадобится следующий метод в соответствии с документом Apple здесь:

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it in the document

или

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here

Ответ 2

По какой-то причине решение Flow не будет работать для меня:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

Однако это произошло:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];

Ответ 3

Я опаздываю на вечеринку, и, как обсуждалось, используя 0 и 1 - это путь, однако есть лучший способ показать это, используя литералы NSNumber BOOL, такие как @YES или @NO. Он преобразует его в 1 или 0, но более визуально.

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];

Ответ 4

Подкрадываясь с ответом Swift 3/4:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

Мы должны использовать NSNumber, видимо, потому что буквальный bool неприемлем для Apple.

Украден отсюда;)

Ответ 5

Объекты Core Data не имеют значений по умолчанию при создании атрибутов для Entity, поэтому для выполнения работы с предикатом вы должны либо устанавливать значения по умолчанию для логических атрибутов, либо использовать предикат таким образом.

Если вы укажите значение по умолчанию (НЕТ или ДА) для любого логического свойства Entity, используйте предикат, подобный этому

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == %0"];

Если у вас не есть значения по умолчанию или некоторые из объектов уже созданы без значений по умолчанию, то для фильтрации по значению false используйте это предложение:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];

Ответ 6

Вы не указали, какие результаты вы получаете. Две вещи, которые отсутствуют в вашем списке кодов, это то, где вы устанавливаете свой объект запроса и где вы действительно запрашиваете контекст для выполнения запроса на выборку. Я бы начал там.

Ответ 7

Для меня это произошло потому, что значение coz для присваивания в Object неверно при сохранении.

Вы должны сохранить как это

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false]

Тогда весь предикат будет работать при извлечении.

например.

// Filter only unvisible item
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"];

Ответ 8

Я продолжаю получать бит от этого, и не всегда ясно, что логические данные в основных данных сохраняются как NSNumbers.

По большей части я уверен, что при создании сущностей я устанавливаю @NO для любых логических свойств, но всегда бывает, когда я трачу целую кучу времени, пытаясь понять, почему тест не проходит, когда я забыл установить @NO на создание сущности.

Это может быть не лучший выбор для четкого кода, но теперь я начал всегда использовать!= предикаты для булевых данных в таких основных данных, как (isCompleted!= YES), а не (isCompleted == NO). Факт nil == false pattern верен везде, но не в основных предикатах данных, и свойства могут быть очень запутанными.

Ответ 9

Swift:

fetchRequest.predicate = NSPredicate(format: "%K == NO",#keyPath(MyEntity.isOccupied))

или же

fetchRequest.predicate = NSPredicate(format: "%K == NO",\MyEntity.isOccupied)