NSPredicate 获取低于指定值的最大值

Posted

技术标签:

【中文标题】NSPredicate 获取低于指定值的最大值【英文标题】:NSPredicate to get maximum value below a specified value 【发布时间】:2013-03-13 12:28:57 【问题描述】:

我有一个基于核心数据的 NSDates 和数值表。

我正在尝试创建一个NSPredicate 来获取低于给定日期的最大日期的数值,例如对于 DEC-31-2012,如果这是 DEC-31-2012 之前的最新日期,我想获得 DEC-30-2012DEC-29-2012

很遗憾,我的谓词不起作用并导致运行时崩溃:

NSFetchRequest *request = [NSFetchRequest 
   fetchRequestWithEntityName:NSStringFromClass([self class])];
NSPredicate *predicate = [NSPredicate 
   predicateWithFormat:@"SUBQUERY(SELF,$x,$x.date.@max <= %@)",endDate];

错误:

无法解析格式字符串“SUBQUERY(SELF,$x,$x.date.@max

我需要如何重写我的谓词才能使其正确?

谢谢!

【问题讨论】:

我确定你已经知道了,但是你拼错了“SUBQUERY()” 谢谢,我确实错过了这个拼写错误。 【参考方案1】:

以下策略应该有效:

使用一个谓词来获取日期低于给定日期的所有对象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date < %@", endDate];
[request setPredicate:predicate];

添加排序描述符以按日期对结果进行排序降序,以便最后日期在前:

NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
[request setSortDescriptors:@[sortDesc]];

将获取限制设置为一:

[request setFetchLimit:1];

通过设置启动参数“-com.apple.CoreData.SQLDebug 1”,可以看到过滤是在SQLite级别完成的:

SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZDATE, t0.ZNAME FROM ZENTITY t0 WHERE  t0.ZDATE < ? ORDER BY t0.ZDATE DESC LIMIT 1

【讨论】:

这是我目前在“旧”代码中所做的,与纯基于数据库的计算相比,它似乎相当慢。 @AlexR:我认为所有计算都是在 SQLite 级别完成的。您可以将“-com.apple.CoreData.SQLDebug 1”添加到您的应用启动参数以查看 SQLite 语句及其执行时间。【参考方案2】:

这样应用谓词

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"startDate <= %@ && endDate >= %@", start, end];

在哪里

startendNSDate Objects (dateRange)

startDateendDate 是键。

【讨论】:

谢谢你,阿伦!这将如何给出下面的最大日期是 endDate?

以上是关于NSPredicate 获取低于指定值的最大值的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 比较字符串小于其他字符串

NSPredicate 搜索具有 nil 值的连接表

NSPredicate 获取给定值下属性的最大值

确定整数溢出是不是超过或低于界限

如果 NSPredicate 失败,啥输出将返回 Fetch 请求

核心数据:NSPredicate 对象由实体对象组成