核心数据NSPredicate检查BOOL值

时间:2010-09-08 16:47:09

标签: iphone objective-c database core-data nspredicate

我目前在从db中提取所有数据时遇到问题,即1参数为TRUE。

我正在使用NSPredicate,以下是示例代码

NSManagedObjectContext *context = managedObjectContext_;

if (!context) {
    // Handle the error.
    NSLog(@"ERROR CONTEXT IS NIL");
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"tblcontent" inManagedObjectContext:managedObjectContext_];

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookmarked == YES"];

[request setPredicate:predicate];

我尝试将predicatewithformat设置为几乎所有内容,但它仍然没有提取具有YES值的书签。

我甚至试过(@"bookmarked == %d",YES)但没有运气。我不想得到整个数组,然后通过if(object.bookmarked == YES) ..... blabla手动过滤它。

我真的很感激一些帮助。

非常感谢。

9 个答案:

答案 0 :(得分:59)

基于Apple文档Here,我们可以使用以下两种方法来比较布尔值:

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

但是,上面的谓词无法得到空anAttribute的谓词。要处理空属性,根据Apple文档here

,您需要以下方法
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"]; // it's in the document

predicate = [NSPredicate predicateWithFormat:@"firstName == nil"]; // == and = are interchangeable here

答案 1 :(得分:12)

出于某种原因,Flow的解决方案对我不起作用:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];

但是,这样做了:

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == 1"];

答案 2 :(得分:10)

我迟到了派对,正如使用0和1讨论的那样,但有一种更好的方法可以通过使用NSNumber BOOL文字来显示它,如@YES或@NO。它将其转换为1或0,但在视觉上更友好。

NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == %@", @NO];

答案 3 :(得分:4)

使用Swift 3/4回答:

let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))

我们显然必须使用NSNumber,因为每个Apple都不接受文字bool。

Stolen from here ;)

答案 4 :(得分:3)

在为Entity创建属性时,核心数据实体没有任何默认值,因此要使谓词工作,您应该为布尔属性设置默认值或以这种方式使用谓词。

如果你为实体的任何布尔属性提供默认值(NO或YES),那么使用这样的谓词

[NSPredicate predicateWithFormat:@"boolAttribute == %@", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == NO", @NO];
[NSPredicate predicateWithFormat:@"boolAttribute == %0"];

如果你没有有默认值或者某些实体已经创建了没有默认值,那么要按 false 值进行过滤,请使用以下句子:

[NSPredicate predicateWithFormat:@"boolAttribute == %@ || boolAttribute == nil", @NO];

答案 5 :(得分:1)

你还没有提到你得到的结果。代码清单中缺少的两件事是您设置请求的实体以及实际请求上下文执行获取请求的位置。我会从那里开始。

答案 6 :(得分:1)

对我来说,保存时,对象中的赋值值是错误的。

你必须像这样保存

YourNSMNanagedObject.visibleBoolean = [[NSNumber alloc] initWithBool:false]

然后所有谓词在提取时都会起作用。

E.g。

// Filter only unvisible item
NSPredicate *favouriteFilter = [NSPredicate predicateWithFormat:@"visibleBoolean==NO"];

答案 7 :(得分:0)

我一直不知所措,并不总是清楚核心数据中的布尔值会被保存为NSNumber。

在大多数情况下,我确保在创建实体时,我为任何布尔属性设置了@NO但总是出现这种情况,我花了大量时间试图弄清楚为什么测试没有当我忘记在实体创建时设置@NO时通过。

这可能不是清晰代码的最佳选择,但我现在开始总是使用!=谓词来核心数据中的布尔值,如(isCompleted!= YES)而不是(isCompleted == NO)。事实上nil == false模式在其他任何地方都是正确的,但在核心数据谓词和属性中则不是很混乱。

答案 8 :(得分:0)

迅速:

fetchRequest.predicate = NSPredicate(format: "%K == NO",#keyPath(MyEntity.isOccupied))

fetchRequest.predicate = NSPredicate(format: "%K == NO",\MyEntity.isOccupied)