NSPredicate - фильтрация значений на основе сохраненного значения BOOLEAN - PullRequest
33 голосов
/ 10 августа 2010

У меня есть объект модели данных ядра, который называется Entry.В этом у меня есть атрибут IsFavorite.

Я хотел бы использовать NSPredicate для фильтрации результатов моего NSFetchedResultsController.

В настоящее время я получаю EXC_BAD_ACCESS при выполнении выборки.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate. 

NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_];
[fetchRequest setEntity:thisEntry];

NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]];

[fetchRequest setPredicate:predicate];


NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;


NSError *error = nil;
if (![aFetchedResultsController performFetch:&error]) {
    NSlog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

ЕСЛИ я удаляю строку, которая устанавливает предикат в fetchRequest, мой код выполняется отлично.

Я явно нахожусь на предикате, но у меня возникли большие проблемы при попытке выяснить, как выполнять операции надBOOLEAN-значение из базового объекта модели данных.Отмечено, что есть ответы о том, как сделать это с помощью строки или значения int, но я не могу найти пример BOOLEAN.

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

Ответы [ 7 ]

41 голосов
/ 10 августа 2010

Это на самом деле не относится к NSPredicate ... Всякий раз, когда у вас есть %@ в строке формата, соответствующее значение должно быть указателем на объект, а BOOL не подходит. Таким образом, вместо передачи YES, передайте [NSNumber numberWithBool: YES].


В более новых версиях Xcode и SDK, чем когда я изначально писал ответ, вы можете использовать @YES вместо [NSNumber numberWithBool: YES].

30 голосов
/ 06 августа 2014

Из документации Apple:

Булевы значения

Вы определяете и проверяете равенство логических значений, как показано в следующих примерах:

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

Однако, кое-что, что поймало меня:

Обязательно снимите флажок с атрибута сущности Optional и задайте Default Value из YES или NO, в противном случае столбец будет пустым (нулевым?), И приведенные выше предикаты не будут соответствовать строкам, которые не являются явно установлен.

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

24 голосов
/ 09 марта 2012

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

[NSPredicate predicateWithFormat:@"isFavorite == 1"]
2 голосов
/ 17 мая 2017

Swift 3 версия отлично работала для меня:

 let predicate = NSPredicate(format: "isFriend == %@" ,NSNumber(booleanLiteral: false))

после ответа @scipilot bool не должен быть опциональным спасибо за это!

1 голос
/ 17 января 2017

Для меня, на SWIFT 3.0 использовать NSNumber и% @ не работает, мне пришлось использовать целочисленные значения:

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0)
0 голосов
/ 25 октября 2017

на iOS 10, xcode 9.0, ищет основной объект данных управляемого объекта с логическим атрибутом NO:

[NSPredicate predicateWithFormat:@"attributeName == nil"]
0 голосов
/ 10 января 2013

Для меня это работало так

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(isComplete LIKE[c] %@)",[NSString stringWithFormat:@"%@",[NSNumber numberWithBool:YES]]];
...