iphone - 核心数据 : Is it possible to use custom function in group by

标签 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 提取中使用核心数据是不可能的。我将 NSFetchRequest 与 setPropertiesToGroupBy 一起使用(仅限 iOS 5.0)。

更新。有一个 example使用苹果提供的核心数据获得此类行为。但是,我启用了“-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.

最佳答案

是的,你可以。组装你的 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];
}

请求会返回按年份分组的结果,这样遇到的每个年份都会成为一个section。

如果您也需要按月分组,您可能需要适本地更改日历组件。

对于 count(*) 添加一个 NSExpression 到你的 fetchRequest:

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

关于iphone - 核心数据 : Is it possible to use custom function in group by,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11330090/

相关文章:

iphone - 当我使用 2 个 TableView 时,如何将数据(托管对象)从一个 TableView 移动到另一个 TableView ?

ios 使用 mfMailComposer 发送 docx 附件失败

c - 当另一个程序访问 SQLite 数据库时如何解锁它?

ios - 将自动布局应用于 UISegmentedControl

ios - 上下 PageViewController

python将独特的项目添加到一个巨大的表中

ios - 从sqlite数据库加载大量数据时未显示事件指示器

ios - 如何在 iOS 7 上使用游戏中心创建现场比赛?

iphone - 调用可选的委托(delegate)方法

ios - [[NSNotificationCenter defaultCenter] addObserver:选择器:@selector(mymethod)名称:对象:];在iOS 9中不再被调用