NSPredicate - 根据BOOLEAN存储值过滤值

时间:2010-08-10 01:37:32

标签: iphone xcode 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示例。

非常感谢!

8 个答案:

答案 0 :(得分:41)

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


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

答案 1 :(得分:30)

来自Apple的文档:

  

布尔值

     

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

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

然而,有些东西引起了我的注意:

请务必取消勾选Optional实体属性并设置Default Value YESNO,否则该列将为空(null?)和上述谓词将不匹配未明确设置的行。

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

答案 2 :(得分:24)

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

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

答案 3 :(得分:2)

swift 3版本对我很有用:

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

在@scipilot回答之后,bool不应该是可选的。谢谢你!

答案 4 :(得分:1)

对我来说,在 SWIFT 3.0 上使用NSNumber并且%@没有用,我必须使用整数值:

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

答案 5 :(得分:1)

有趣的是,如果您“知道”想要的那个,则可以:

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

示例

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

您将对“已订阅”,“新”等内容执行此操作。

答案 6 :(得分:0)

在iOS 10上,xcode 9.0,寻找具有布尔NO属性的核心数据managedObject:

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

答案 7 :(得分:-1)

对我而言,它就像这样工作

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