【问题标题】:NSPredicate to get maximum value below a specified valueNSPredicate 获取低于指定值的最大值
【发布时间】: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()”
  • 谢谢,我确实错过了这个拼写错误。

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


【解决方案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?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-11
  • 1970-01-01
相关资源
最近更新 更多