在核心数据谓词中使用“date”方法

时间:2014-12-24 12:24:10

标签: ios objective-c sqlite core-data

我的核心数据库中有一个任务实体列表。

我只想查询其dueDate属性为Today的任务。

现在,由于技术原因,我想将查询保存在我的CoreData表中。 (在另一个实体中)。 意思是我必须以某种方式告诉sqlite,返回当前日期。 我尝试使用NSPredicate这样无济于事:

dueDuate > date('now','start of day')

我有一个例外:

Unable to parse function name 'date' into supported selector (date) 

无论如何要实现我的目标?

1 个答案:

答案 0 :(得分:-1)

将查询存储在必须查询和检索的Core Data实体中是不必要的,也是不可行的。这就像写一个电话号码来查询这个地址门上的地址。

最简单的方法是简单地将日期保留为属性,然后构造简单谓词以检索此日期的List个对象。所需要的只是某一天的开始和结束。

[NSPredicate predicateWithFormat:"dueDate > %@ && dueDate < %@", dayStart, dayEnd]

就是这样。您的“没有更多日期操作”的要求是不现实的,因为您需要动态计算一天的开始和结束。将它存储在Core Data的持久存储中是无稽之谈。

所以要获取任何日期的开始日期(在NSDate上写为category):

-(NSDate *)startOfDay { 
  NSDateComponents *components = [[NSCalendar currentCalendar] components:
    NSCalendarUnitYear| NSCalendarUnitMonth | NSCalendarUnitDay 
    fromDate: self];
  components.hour = 0; components.minute = 0; components.second = 0;
  return [[NSCalendar currentCalendar] dateFromComponents:components];
}

任何一天的结束

-(NSDate *)endOfDay {
   NSDateComponents *components = [[NSDateComponents alloc] init];
   components.day = 1;
   return [[NSCalendar currentCalendar] dateByAddingComponents:components
          toDate:self.startOfDay options:0];
}

对于上面的谓词,您只需将dayStartdayEnd分别替换为[[NSDate date] startOfDay][[NSDate date] endOfDay]