使用 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
。
我尝试在我的表中创建两个 NSDate
columns 并使用谓词:[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 <= %@ AND createdAt + diasSerieAtiva >= %@", hoje, hoje];
where createdAt
is NSDate
and diasSeriesAtiva
os NSNumber
,这两列都在我的数据库表中。
我在diasSerieAtiva
column 和createdAt
column 中有两个编号为604800 的对象,这两个对象都有2013-12-26T18:26:20.721Z。以上是关于使用 NSPredicate 比较日期以检索符合条件的对象的主要内容,如果未能解决你的问题,请参考以下文章