Iphone NSPredicate-基于布尔存储值筛选值

Iphone NSPredicate-基于布尔存储值筛选值,iphone,xcode,nspredicate,boolean,Iphone,Xcode,Nspredicate,Boolean,我有一个名为Entry的核心数据模型对象。 在这里,我有一个属性IsFavorite 我想使用NSPredicate筛选NSFetchedResultsController的结果 当前,在执行提取时,我获得了EXC_BAD_访问权限 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; // Edit the entity name as appropriate. NSEntityDescription *thisEntr

我有一个名为Entry的核心数据模型对象。 在这里,我有一个属性IsFavorite

我想使用NSPredicate筛选NSFetchedResultsController的结果

当前,在执行提取时,我获得了EXC_BAD_访问权限

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上设置谓词的行,我的代码将完美地执行

很明显,我对谓词不了解,但在试图找出如何对核心数据模型对象中的布尔值执行操作时遇到了很多困难。值得注意的是,有关于如何使用字符串或int值来实现这一点的答案,但我找不到布尔示例


非常感谢

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



在较新版本的Xcode和SDK中,如果你知道你在寻找一个是(因此在不同的情况下不需要在是或否之间切换),你可以使用
@YES
而不是
[NSNumber numberWithBool:YES]
,这对我很有用:

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

对我来说是这样的

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

从苹果的文档中:

布尔值

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

然而,有件事让我大吃一惊:

确保取消勾选
可选
实体属性,并设置
默认值
,否则该列将为空(null?),并且上述谓词将与未显式设置的行不匹配


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

对于我来说,在SWIFT 3.0上使用NSNumber和%@不起作用,我必须使用整数值:

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

swift 3版本对我来说非常有用:

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

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

在iOS 10、xcode 9.0上,正在查找没有布尔属性的核心数据管理对象:

[NSPredicate predicateWithFormat:@"attributeName == nil"]
有趣的是,如果你“知道”你想要哪一个,你可以:

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

let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CDThing")
let p = NSPredicate(format: "showMe == true")
r.predicate = p
let r=NSFetchRequest(entityName:“CDThing”)
设p=NSPredicate(格式:“showMe==true”)
r、 谓词=p

您可以对“订阅”、“新建”等内容执行此操作。

我已经更新了上面的代码,但仍然会因为EXC\u BAD\u访问而崩溃:(是Entity.Attribute=?正如我所写的那样?还是仅仅是Attribute=?如果我使用像这样的NSNumber描述,这对我很有效。
[[NSNumber numberWithBool:NO]描述]当
stringWithFormat
询问对象的字符串表示形式时,调用
description
方法。您应该能够使用
NSNumber
实例,而无需调用该
description
调用。该方法应该用于动态值。@KETAN如果您知道要查找的是,那么@“isFavorite==YES”将起作用。我认为您应该使用“%@”,“Yessory@János我还不太了解Swift。非常感谢您指向“确保取消勾选可选实体属性”".节省了我的时间!很高兴能帮上忙!我花了几个小时在上面…现在我更加关注右侧面板,直到那时我才开始忽略它。非可选布尔值修复了我遇到的一个大问题。在我看来,检查BoolatAttribute!=是应该有效,但直到我在字段上设置了默认值才有效谢谢可选a上的提示nd默认值,您保存了我的一天!
let r = NSFetchRequest<NSFetchRequestResult>(entityName: "CDThing")
let p = NSPredicate(format: "showMe == true")
r.predicate = p