0

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

我正在尝试创建一个NSPredicate来获取低于给定日期的最大日期的数值,例如对于 DEC-31-2012,我想获取DEC-30-2012或者DEC-29-2012如果这是之前的最新日期DEC-31-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 <= %@)”

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

谢谢!

4

2 回答 2

4

以下策略应该有效:

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

    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
于 2013-03-13T12:39:29.993 回答
0

像这样应用谓词

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

在哪里

start并且endNSDate Objects(日期范围)

startDate并且endDate是钥匙。

于 2013-03-13T12:43:42.700 回答