NSPredicate - 根据BOOLEAN存储值过滤值

Lan*_*nce 34 iphone xcode boolean nspredicate

我有一个名为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();
}
Run Code Online (Sandbox Code Playgroud)

如果删除在fetchRequest上设置谓词的行,我的代码就会完美执行.

我显然是n00bin在谓词上但是在尝试找出如何从核心数据模型对象对BOOLEAN值执行操作时遇到了很多麻烦.需要注意的是,有关如何使用字符串或int值进行此操作的答案,但我找不到BOOLEAN示例.

非常感谢 !

JWW*_*ker 42

这并不是特定于NSPredicate ...每当你有%@一个格式字符串时,相应的值必须是一个指向对象的指针,并且BOOL不符合条件.因此,不是传递YES,而是传递[NSNumber numberWithBool: YES].


在较新版本的Xcode和SDK中,比我最初编写答案时,您可以使用@YES而不是[NSNumber numberWithBool: YES].


sci*_*lot 30

来自Apple的文档:

布尔值

您可以指定并测试布尔值的相等性,如以下示例所示:

NSPredicate *newPredicate =
    [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue =
    [NSPredicate predicateWithFormat:@"anAttribute == YES"];
Run Code Online (Sandbox Code Playgroud)

然而,有些事情让我感到困惑:

一定要取消选中Optional实体的属性和设置Default ValueYESNO,否则列将是空(NULL?)和上述谓词将不匹配未明确设置的行.

我通过查看生成的模拟器数据库,使用了很棒的应用程序sqllitebrowser来诊断这个.

  • 非常感谢您指出“请务必取消勾选可选实体属性”。节省了我的时间! (2认同)
  • 非可选布尔值解决了我遇到的一个大问题。在我看来,检查 boolAttribute != YES 应该有效,但直到我在字段上设置默认值后才有效 (2认同)
  • 感谢您提供有关可选值和默认值的提示,您救了我的命! (2认同)

wre*_*ees 25

如果你知道你正在寻找是(因此不需要在不同情况下在YES或NO之间切换),这对我有用:

[NSPredicate predicateWithFormat:@"isFavorite == 1"]
Run Code Online (Sandbox Code Playgroud)

  • @KETAN如果你知道你在寻找YES,那么@"isFavorite == YES"就可以了. (6认同)