核心数据:是不是可以在 group by 中使用自定义功能
Posted
技术标签:
【中文标题】核心数据:是不是可以在 group by 中使用自定义功能【英文标题】:Core Data: Is it possible to use custom function in group by核心数据:是否可以在 group by 中使用自定义功能 【发布时间】:2012-07-05 00:24:27 【问题描述】:在objective-c中制作NSFetchRequest时,是否可以按组使用自定义函数(strftime)? sql 语句在 sqlite 中完全有效:
select date, count(*) from note group by strftime('%Y%m%d', date)
但是,经过一天的挖掘和尝试各种方法和解决方案后,我得出的结论是,在单个 sql fetch 中使用核心数据是不可能的。我将 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.
【问题讨论】:
【参考方案1】:是的,你可以。组装你的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(*),将 NSExpression
添加到您的 fetchRequest:
NSExpression * many = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"someAttribute"]]];
【讨论】:
谢谢,会试试的。注意到了,NSFetchedResultsController 经常和委托一起使用,设置 NSFetchedResultsController 委托是强制的还是可选的?我可以像 NSFetchRequest 一样使用它吗? 委托是可选的。请参阅文档:An instance of NSFetchedResultsController uses methods in this protocol to notify its delegate that the controller’s fetch results have been changed due to an add, remove, move, or update operations.
例如,在 UITableView 中,您可以在修改数据集后使用它来更新行和部分以上是关于核心数据:是不是可以在 group by 中使用自定义功能的主要内容,如果未能解决你的问题,请参考以下文章
SQLite - 是不是可以在同一个查询中使用 group_concat 函数但 'GROUP BY' 不同的标准?