Подтвердить что ты не робот

NSPredicate - значения фильтрации на основе сохраненного значения BOOLEAN

У меня есть объект модели данных ядра, называемый 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, мой код выполняется отлично.

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

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

4b9b3361

Ответ 1

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


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

Ответ 2

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

Логические значения

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

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

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

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

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

Ответ 3

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

[NSPredicate predicateWithFormat:@"isFavorite == 1"]

Ответ 4

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

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

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

Ответ 5

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

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0)

Ответ 6

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

[NSPredicate predicateWithFormat:@"attributeName == nil"]

Ответ 7

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

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