使用 NSPredicate 比较日期以检索符合条件的对象

Posted

技术标签:

【中文标题】使用 NSPredicate 比较日期以检索符合条件的对象【英文标题】:Compare Dates using NSPredicate to retrieve objects that meet criteria 【发布时间】:2013-12-27 11:15:10 【问题描述】:

我正在尝试根据特定键中的值过滤对象的 NSArray。我的对象有一个创建日期,所以基本上,我想创建三个月的对象,但每周只显示一个,因此,我需要过滤结果以根据日期显示对象。

我有一个数据库,其中包含创建这些对象所需的所有信息。我的第一个想法是在这个数据库中创建一个句点键,指定对象可用的时间。例如,对象 1 的“period”键中将包含数字 604800(一周的时间间隔)。现在,为了检索这些对象,我需要比较两个键,createdAt 是 NSDate,timeInterval 是 NSNumber

我尝试在我的表中创建两个 NSDatecolumns 并使用谓词:[NSPredicate predicateWithFormat:"(startDate <= %@) AND (endDate >= %@"), today, today];,虽然我需要做更多的工作来创建带有这两个添加列的对象,但提到的谓词不起作用,我不确定为什么。

无论如何,我正在寻找一个简单的解决方案和一些代码。

【问题讨论】:

您的" 看起来放错了位置.. 检查一次 是的,抱歉,这是一个输入错误,但不是问题。 如果你通过today 两次(<=>=),那不是只给你完全相等(==)吗? 存储在数组中的对象的结构(属性及其类)是什么?可能您需要将谓词更改为[NSPredicate predicateWithFormat:@"(SELF.startDate <= %@) AND (SELF.endDate >= %@)", today, today]; 或使用sortedArrayUsingFunction: 【参考方案1】:

您不必创建和填充额外的列,因为您可以进行简单的算术运算 在谓词中,例如:

[NSPredicate predicateWithFormat:@"createdAt <= %@ AND createdAt + period >= %@", today, today]

其中createdAt 是“日期”属性,period 是“双”属性。

更新:正如我刚刚意识到的,这只有在你也设置时才有效

[request setIncludesPendingChanges:NO];

这意味着只对保存的数据库执行提取,但不会 不包括未保存的更改。

【讨论】:

这就是我要找的。我会尽力提供反馈。似乎它会工作。 应用程序崩溃并显示消息 unrecognized selector sent to instance。我的月经是NSNumber,我不确定这是否是问题所在。如果是,是否可以将其转换为NSPredicate中的double @Jorge:我用NSDate *createdAt; NSNumber *period; 对其进行了测试,并且成功了。你能显示完整的错误信息吗? Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDate objCType]: unrecognized selector sent to instance 0x10b551d50'这是我的代码:NSPredicate *predicateTime = [NSPredicate predicateWithFormat:@"createdAt &lt;= %@ AND createdAt + diasSerieAtiva &gt;= %@", hoje, hoje];where createdAtis NSDateand diasSeriesAtivaos NSNumber,这两列都在我的数据库表中。 我在diasSerieAtivacolumn 和createdAtcolumn 中有两个编号为604800 的对象,这两个对象都有2013-12-26T18:26:20.721Z。

以上是关于使用 NSPredicate 比较日期以检索符合条件的对象的主要内容,如果未能解决你的问题,请参考以下文章

coredata NSPredicate 中的日期比较

NSPredicate:比较没有时间的日期(目标 C)

NSPredicate 一对多日期比较

使用 NSPredicate 查询 CloudKit 以获取空白(或 null 或其他)的日期

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

NSPredicate 查找标题键以元音开头的所有对象