布尔值的 NSPredicate

NSPredicate for a boolean

我在一个实体上有一个布尔属性,为它生成的代码是:

@property (nonatomic, retain) NSNumber * countdownMode;
@dynamic countdownMode;

实体保存为:

score.countdownMode = @(YES);

fetchRequest 具有以下谓词:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == YES"];

出于某种原因,提取从来没有 returns 任何东西..有什么想法吗?删除谓词时,将提取行。在调试器中,我可以看到 countdownMode 是 1。我也试过这些但没有成功:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == %@", @YES];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countdownMode == %d", YES];

这看起来应该很简单,但它没有返回任何结果。感谢帮助。

不建议将布尔值显式地与 YES 进行比较。因此试试这个案例:

BOOL yes = YES;
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"countDownMode == %@", [NSNumber numberWithBool:yes]];

所有这些是完全等价的。

@"count = 1"
@"count = true"
@"count = YES"
@"count = %@", @YES
@"count = %@", [NSNumber numberWithBool:YES]
// plus all these versions with "=="

None 是最好的,除了简洁和清晰的原因。对SQLite数据库的调用结果完全一样,所以在效果、安全和性能上绝对没有区别。

你看,SQLite数据库正在存储“1”。 (这是一个可能会改变的实现细节,所以不要依赖它。尽管如此,出于所有实际目的,它并不重要)。

还有,@YES[NSNumber numberWithBool:YES]是完全一样的。前者是 "Modern Objective C" 引入的一种新的文字表示法。

由此可见,没有记录的原因一定是不同的。检查您的托管对象上下文是否不是 nil;如果没有另一个谓词限制结果;如果您显示的结果与您认为已获取的结果不同;如果您在执行提取之前没有无意中更改数据;如果您忘记在正确的地方打电话 save,等等