核心数据:是否可以在分组中使用自定义功能

时间:2012-07-04 13:29:26

标签: iphone objective-c sqlite core-data

在objective-c中制作NSFetchRequest时,是否可以逐个使用自定义函数(strftime)? sql语句在sqlite中完全有效:

select date, count(*) from note group by strftime('%Y%m%d', date)

然而,经过一天的挖掘和尝试各种方法和解决方案后,我得出结论,单个sql fetch中的核心数据是不可能的。我正在使用带有setPropertiesToGroupBy的NSFetchRequest(仅限iOS 5.0)。

更新。有一个example用于获取apple提供的核心数据的此类行为。但是,我已启用“-com.apple.CoreData.SQLDebug 1”来显示由核心数据执行的SQL。看来,核心数据没有执行我想要的SQL。它只是通过第一个SQL查询选择它们,然后遍历执行多个“SELEC .. WHERE ID IN ....”SQL查询的组。来自控制台的摘录:

2012-07-05 10:34:57.244 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK     FROM ZEVENT t0 ORDER BY t0.ZTIMESTAMP
2012-07-05 10:34:57.245 DateSectionTitles[1139:fb03] CoreData: annotation: sql   connection fetch time: 0.0010s
2012-07-05 10:34:57.246 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch    execution time: 0.0015s for 52 rows.
2012-07-05 10:34:57.247 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTIMESTAMP, t0.ZTITLE FROM ZEVENT t0 WHERE  t0.Z_PK IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)  ORDER BY t0.ZTIMESTAMP LIMIT 20
2012-07-05 10:34:57.248 DateSectionTitles[1139:fb03] CoreData: annotation: sql connection fetch time: 0.0012s
2012-07-05 10:34:57.249 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch execution time: 0.0022s for 20 rows.
2012-07-05 10:34:57.250 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTIMESTAMP, t0.ZTITLE FROM ZEVENT t0 WHERE  t0.Z_PK IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)  ORDER BY t0.ZTIMESTAMP LIMIT 20
2012-07-05 10:34:57.281 DateSectionTitles[1139:fb03] CoreData: annotation: sql connection fetch time: 0.0303s
2012-07-05 10:34:57.281 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch execution time: 0.0310s for 20 rows.

1 个答案:

答案 0 :(得分:4)

是的,你可以。将您的NSFetchedResultsController组合为:

  NSFetchedResultsController *aFetchedResultsController =
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
  managedObjectContext:someManagedObjectContext
  sectionNameKeyPath:@"yearOnly" // <== 
  cacheName:@"cacheAsneeded"];

然后在NSManagedObject类中添加一个与sectionNameKeyPath

一起使用的方法
- (int)yearOnly { // 
   NSCalendar *cal = [NSCalendar currentCalendar];
   return [[cal components:NSYearCalendarUnit fromDate:self.date] year];
}

请求将返回按年份分组的结果,以便每个遇到的年份都成为一个部分。

如果您还需要按月分组,则可能需要相应地更改日历组件。

对于count(*),在fetchRequest中添加NSExpression

 NSExpression * many = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"someAttribute"]]];