2010-08-10 80 views
27

我有一个名为Entry的核心数据模型对象。 在这我有一个属性IsFavorite。NSPredicate - 基于布尔值存储值筛选值

我想使用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值上执行操作时遇到了很多麻烦。请注意,有关如何使用字符串或整型值执行此操作的答案,但我找不到BOOLEAN示例。

非常感谢!

回答

37

这不是NSPredicate所特有的......只要格式字符串中有%@,相应的值必须是指向对象的指针,BOOL不具有限定条件。所以不是通过YES,而是通过[NSNumber numberWithBool: YES]


在Xcode中的新版本和软件开发工具包比我原来写的答案,你可以使用@YES而不是[NSNumber numberWithBool: YES]

+0

我已经更新了我上面的代码 - 这仍与EXC_BAD_ACCESS崩溃:( 会不会是实体。如果我使用了这样的NSNumber描述 ''[[NSNumber numberWithBool:NO] ='我写了'或只是属性=? – Lance 2010-08-10 01:53:20

+0

这不是取得崩溃的应用程序 - 谢谢你的帮助 – Lance 2010-08-10 01:59:38

+1

这对我有用,描述];' – 2011-04-20 18:50:34

22

如果你知道你正在寻找一个YES(因此不需要或在不同情况下YES之间切换NO),这个工作对我来说:

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

它应该是一个动态值。 – KETAN 2012-06-11 06:58:53

+5

@KETAN如果你知道你正在寻找YES,那么@“isFavorite == YES”将会起作用。 – brodney 2013-02-18 21:31:50

+0

我认为你应该使用“%@”,@YES – OMGPOP 2014-02-01 09:37:49

-1

对于我来说,像这样工作

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

从苹果公司的文档:

布尔值

您指定并测试如下面的例子说明的布尔值的平等:

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

然而,有些东西,引起了我出去:

一定要勾去掉Optional实体属性和设置Default ValueYESNO,否则该列将为空(空?),并且上述谓词将不匹配未明确设置的行。

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

+0

对不起@亚诺斯我还不太了解斯威夫特。 – scipilot 2015-01-22 10:04:11

+0

非常感谢您指出“确保取消选择可选实体属性”。节省了我的时间! – 2015-04-04 22:52:20

+0

很高兴帮助!我花了几个小时在上面......现在我更关注那个右侧面板,直到那时我才会忽略它。 – scipilot 2015-04-05 05:20:00

0

对我而言,SWIFT 3。0使用的NSNumber和%@没有工作,我不得不用整数值:

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

迅速3版对我来说真是棒极了:

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

以下@scipilot回答布尔不应是可选的。感谢那!

0

iOS上的10时,Xcode 9.0,寻找与布尔NO属性的核心数据managedObject:

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