带有 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 不起作用的主要内容,如果未能解决你的问题,请参考以下文章