NSPredicate 获取低于指定值的最大值
Posted
技术标签:
【中文标题】NSPredicate 获取低于指定值的最大值【英文标题】:NSPredicate to get maximum value below a specified value 【发布时间】:2013-03-13 12:28:57 【问题描述】:我有一个基于核心数据的 NSDate
s 和数值表。
我正在尝试创建一个NSPredicate
来获取低于给定日期的最大日期的数值,例如对于 DEC-31-2012,如果这是 DEC-31-2012
之前的最新日期,我想获得 DEC-30-2012
或 DEC-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];
在哪里
start
和 end
是 NSDate Objects
(dateRange)
startDate
和 endDate
是键。
【讨论】:
谢谢你,阿伦!这将如何给出下面的最大日期是 endDate?以上是关于NSPredicate 获取低于指定值的最大值的主要内容,如果未能解决你的问题,请参考以下文章