Проверка основных данных NSP предиката для значения BOOL - PullRequest
31 голосов
/ 08 сентября 2010

У меня сейчас проблема с извлечением всех данных из базы данных, из-за чего 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];

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

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

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

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

Ответы [ 9 ]

59 голосов
/ 09 января 2012

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

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

или

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here
12 голосов
/ 26 февраля 2014

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

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

Однако это сработало:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];
10 голосов
/ 01 апреля 2015

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

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];
4 голосов
/ 16 ноября 2017

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

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

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

Украдено здесь;)

3 голосов
/ 12 июля 2016

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

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

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

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

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];
1 голос
/ 05 ноября 2014

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

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

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

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

например.

// Filter only unvisible item
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"];
1 голос
/ 08 сентября 2010

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

0 голосов
/ 10 июля 2019

Свифт:

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

или

fetchRequest.predicate = NSPredicate(format: "%K == NO",\MyEntity.isOccupied)
0 голосов
/ 19 января 2017

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

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

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

...