Core Data NSPПроверка предикатов для значения BOOL

В настоящее время у меня возникла проблема с извлечением всех данных из базы данных, при этом 1 параметр имеет значение ИСТИНА.

Я использую 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.

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

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


person user281300    schedule 08.09.2010    source источник


Ответы (9)


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

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

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

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

or

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

Пробираясь с ответом Swift 3/4:

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

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

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

person davidrynn    schedule 16.11.2017
comment
МОЙ БОГ! Вы спасли мне жизнь ... ПОЧЕМУ он работает с false, но не с true ... Мне потребовалось время, чтобы даже найти строку, которая приводит к сбою моего приложения, потому что трассировка стека совершенно бесполезна. - person randomcontrol; 20.05.2021

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

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

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

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];
person Dan Loughney    schedule 26.02.2014
comment
Также в моем случае решение Flow не сработало. Он работал с anAttribute == 1 - person Hussain KMR Behestee; 21.02.2015

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

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];
person Patrick    schedule 01.04.2015

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

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

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

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

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];
person Nikolay Shubenkov    schedule 12.07.2016
comment
Проверка на null важна, тем более, что после завершения выборки может оказаться, что записи типа bool ложны, хотя на самом деле они равны нулю. - person lewis; 09.06.2020

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

person Joshua Nozzi    schedule 08.09.2010
comment
Привет, я не включил это в код. Результаты, которые я получаю, - это в основном все. Как будто никакая фильтрация не работает. - person user281300; 08.09.2010
comment
Привет снова, я думаю, что перед этим что-то не так. То есть каждый возвращаемый контент имеет object.bookmarked = YES, хотя по умолчанию я установил для него значение NO. Мне нужно будет это проверить. Думаю, предикат работает. В любом случае спасибо. - person user281300; 08.09.2010
comment
Ха, теперь он работает нормально. тупой я забыл сбросить дб из симулятора сначала дох !! В любом случае приведенный выше код в порядке. - person user281300; 08.09.2010

Для меня это случилось, потому что присвоение значения в объекте неверно при сохранении.

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

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

Тогда все предикаты будут работать при выборке.

E.g.

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

Быстрый:

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

or

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

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

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

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

person SpaceTrucker    schedule 19.01.2017