带有 BOOL 比较的 CoreData NSPredicate 不起作用

Posted

技术标签:

【中文标题】带有 BOOL 比较的 CoreData NSPredicate 不起作用【英文标题】:CoreData NSPredicate with BOOL comparison not working 【发布时间】:2014-03-14 22:20:03 【问题描述】:

我要疯了

items = [Item MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"self.userData.checklisted = NO"]];

应该只返回显然有 self.userData.checklisted NO 的项目,但是当我在此行执行后立即调试时,我得到了

(lldb) po [[standItems[0] userData] checklisted]
0

(lldb) po [[standItems[1] userData] checklisted]
1

因此返回了 self.userData.checklisted = YES 的项目(尽管谓词是 self.userData.checklisted = NO)

这种行为的原因是什么?如何让它发挥作用?

更新 我发现问题在于该项目未保存,但是如何使其也与未保存的数据一起使用?

【问题讨论】:

您是否尝试过使用== 而不是=self 也是多余的,你不需要它。如果它是一个复杂的查询,你总是可以使用块匹配器,但我不相信这是这种情况。 @OliverAtkinson === 是同一个 NSPredicate 比较器。 【参考方案1】:

您需要使用+ (NSArray *) MR_findAllWithPredicate:(NSPredicate *)searchTerm inContext:(NSManagedObjectContext *)context 方法(而不是您当前使用的方法),并传递包含尚未保存的更改的上下文。

【讨论】:

不,我看不出有什么不同,因为当您深入研究“MR_findAllWithPredicate:”时,您会发现它调用 MR_findAllWithPredicate: inContext:[self MR_defaultContext]... 而 MR_defaultContext 是未保存的更改 @PeterLapisu 你确定吗?我对 MR 不熟悉,但对 Core Data 很熟悉,在有变化的上下文上执行NSFetchRequest 时,也会参考变化。 在我的测试中,我在执行后立即返回 [[standItems[1] userData] checklisted] == 1...当我保存到持久存储 (MR_saveToPersistentStoreAndWait) 时,此停止发生!扼杀,仅使用 MR_saveOnlySelfAndWait 保存到 MOC 也返回 checklisted == 1

以上是关于带有 BOOL 比较的 CoreData NSPredicate 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Core Data + SwiftUI:无法将“Bool”类型的值转换为预期的参数类型“Binding<Bool>”

Python Bool和int比较以及带有布尔值的列表索引

在谓词中评估 CoreData 实体类型

CoreData 似乎保存了错误的变量

NSPredicate - 核心数据 - 比较两个属性

带有 CoreData 的 TextField