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, мой код выполняется отлично.

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

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


person Lance    schedule 10.08.2010    source источник


Ответы (8)


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


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

person JWWalker    schedule 10.08.2010
comment
Я обновил свой код выше - который все еще вылетает с EXC_BAD_ACCESS :( Будет ли это Entity.Attribute =? Как я написал? Или просто Attribute =? - person Lance; 10.08.2010
comment
Это сработало для меня, если бы я использовал описание NSNumber, подобное этому [[NSNumber numberWithBool: NO] description]; - person T. Markle; 20.04.2011
comment
@T. Markle Метод description вызывается, когда stringWithFormat запрашивает у объекта его строковое представление. Вы должны иметь возможность использовать экземпляр NSNumber без этого вызова description. - person zekel; 08.07.2012

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

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

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

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

Однако кое-что меня зацепило:

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

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

person scipilot    schedule 06.08.2014
comment
Извините, @ János, я еще мало знаю Swift. - person scipilot; 22.01.2015
comment
Большое спасибо за указание на Обязательно снимите флажок Необязательный атрибут сущности. Сэкономил мои часы! - person fir; 05.04.2015
comment
Рад помочь! Я потратил на это часы ... теперь я обращаю больше внимания на эту правую панель, до тех пор я как бы игнорировал ее. - person scipilot; 05.04.2015
comment
Я тоже позавчера :) - person fir; 06.04.2015
comment
Необязательные логические значения исправили мою большую проблему. мне кажется, что проверка на boolAttribute! = YES должна работать, но этого не произошло, пока я не установил значения по умолчанию в поле - person jacob bullock; 16.07.2015
comment
Спасибо за подсказку о необязательном значении и значении по умолчанию, вы спасли мне день! - person Juan Catalan; 23.08.2015

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

[NSPredicate predicateWithFormat:@"isFavorite == 1"]
person wrees    schedule 08.03.2012
comment
это должно быть динамическое значение. - person KETAN; 11.06.2012
comment
@KETAN Если вы знаете, что ищете ДА, тогда @isFavorite == ДА будет работать. - person brodney; 19.02.2013
comment
я думаю, вам следует использовать% @, @YES - person OMGPOP; 01.02.2014

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

NSPredicate(format: "yourAttributeName == %i", yourBooleanValue ? 1 : 0)
person pierre23    schedule 16.01.2017

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

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

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

person Rotem Doron    schedule 17.05.2017

Интересно, что если вы «знаете», какой из них вам нужен, вы можете просто иметь:

let p = NSPredicate(format: "showMe == true")

пример,

let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CDThing")
let p = NSPredicate(format: "showMe == true")
r.predicate = p

Вы бы сделали это для таких вещей, как «подписан», «новый» и т. Д.

person Fattie    schedule 07.02.2020

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

[NSPredicate predicateWithFormat:@"attributeName == nil"]
person Enrico Cupellini    schedule 25.10.2017

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

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