我有一个基于核心数据的NSDate
s表和数值。
我正在尝试创建NSPredicate
以获取低于给定日期的最大日期的数值,例如对于DEC-31-2012,如果这是DEC-30-2012
之前的最新日期,我想获得DEC-29-2012
或DEC-31-2012
。
不幸的是,我的谓词不起作用并导致运行时崩溃:
NSFetchRequest *request = [NSFetchRequest
fetchRequestWithEntityName:NSStringFromClass([self class])];
NSPredicate *predicate = [NSPredicate
predicateWithFormat:@"SUBQERY(SELF,$x,$x.date.@max <= %@)",endDate];
错误:
Unable to parse the format string "SUBQERY(SELF,$x,$x.date.@max <= %@)"
我需要如何重写谓词才能使其正确无误?
谢谢!
答案 0 :(得分:4)
以下策略应该有效:
使用一个谓词来获取日期低于给定日期的所有对象:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"date < %@", endDate];
[request setPredicate:predicate];
添加排序描述符,按日期降序对结果进行排序,以便最后一个日期出现:
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO];
[request setSortDescriptors:@[sortDesc]];
将获取限制设置为1:
[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
答案 1 :(得分:0)
像这样应用谓词
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"startDate <= %@ && endDate >= %@", start, end];
,其中
start
和end
为NSDate Objects
(dateRange)
startDate
和endDate
是关键。