NSPredicate 搜索具有 nil 值的连接表

Posted

技术标签:

【中文标题】NSPredicate 搜索具有 nil 值的连接表【英文标题】:NSPredicate search for join table with nil values 【发布时间】:2013-03-25 00:16:25 【问题描述】:

我正在一个名为Todolists 的表上运行谓词搜索。 Todoliststodos

我正在尝试获取所有Todolists,其中due_at (Date)<= 某个Datedue_at Datenil

以下谓词可以正常工作,并获取所有Todolists,其中Todos 在某个日期之前。

NSDate *now = [NSDate date];
int daysToAdd = _dueDateSlider.intValue;
NSDate *datePeriod = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY todos.due_at <= %@", datePeriod];

但是,以下NSPredicate 搜索会返回所有结果,即使有些结果是due_at Date,有些是nil

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY todos.due_at = nil"];

当我 NSPredicate 搜索 Todos 表时,due_at = nil 似乎工作正常,但在连接搜索中执行时却不行。

目标是完成这项工作:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY todos.due_at <= %@ OR todos.due_at = nil", datePeriod];

如何在连接表中进行谓词搜索以查找 nil 值?

=======更新======

我试图用它作为我的谓词:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"(todos.due_at <= %@) || (todos.due_at = nil)", datePeriod];

但它会导致此错误:

-[__NSArrayI compare:]: unrecognized selector sent to instance 0x1001e36b0

【问题讨论】:

【参考方案1】:

我最终在运行 fetchRequest 返回的 NSArray 上运行 NSPredicate。

// get all todolists from database
NSArray *todolists = [managedObjectContext executeFetchRequest:request error:&error];

// then filter using ALL and ANY
todolists = [todolists filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(ANY todos.due_at <= %@) || (ALL todos.due_at = nil)", datePeriod]];

【讨论】:

以上是关于NSPredicate 搜索具有 nil 值的连接表的主要内容,如果未能解决你的问题,请参考以下文章

使用 nspredicate 获取具有最大属性值的实体以及一个关系

基于一对多值的 NSPredicate 过滤器

在 NSPredicate 中使用 NSNumber == nil 过滤值

添加具有 nil 值的新动态属性

NSKeyedArchiver unarchiveObjectWithData 返回具有 nil 值的对象

防范具有 nil 可选值的开关按钮