我有一个名为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示例。
非常感谢!
答案 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
YES
或NO
,否则该列将为空(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]]];