NSPredicate以获得低于指定值的最大值

时间:2013-03-13 12:28:58

标签: ios objective-c core-data nspredicate nsfetchrequest

我有一个基于核心数据的NSDate s表和数值。 我正在尝试创建NSPredicate以获取低于给定日期的最大日期的数值,例如对于DEC-31-2012,如果这是DEC-30-2012之前的最新日期,我想获得DEC-29-2012DEC-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 <= %@)"

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

谢谢!

2 个答案:

答案 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];

,其中

startendNSDate Objects(dateRange)

startDateendDate是关键。