Iphone 核心数据:是否可以按组使用自定义功能

Iphone 核心数据:是否可以按组使用自定义功能,iphone,objective-c,sqlite,core-data,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)

在objective-c中编写NSFetchRequest时,是否可以按部分分组使用自定义函数(strftime)?sql语句在sqlite中完全有效:

select date, count(*) from note group by strftime('%Y%m%d', date)
然而,经过一天的挖掘和尝试各种方法和解决方案后,我得出结论,在单个sql获取中使用核心数据是不可能的。我将NSFetchRequest与setPropertiesToGroupBy一起使用(仅限iOS 5.0)

更新。苹果公司提供的核心数据有助于获取此类行为。但是,我启用了“-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"];
请求将返回按年份分组的结果,以便每个遇到的年份都成为一个部分

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

对于计数(*),请在fetchRequest中添加一个
NSExpression

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

谢谢,我会试试的。请注意,NSFetchedResultsController经常与委托一起使用,设置NSFetchedResultsController委托是强制的还是可选的?我可以使用与NSFetchRequest相同的方法吗?委托是可选的。请参阅文档:
NSFetchedResultsController的实例使用此协议中的方法通知其委托,由于添加、删除、移动、,或更新操作。
例如,在UITableView中,您可以在修改数据集后使用它更新行和节
 NSExpression * many = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"someAttribute"]]];