2012-07-04 9 views
8

Возможно ли использовать индивидуальную функцию (strftime) в группе по отдельности при создании NSFetchRequest в объективе-c? SQL-утверждения вполне допустимо в SQLite:Основные данные: возможно ли использовать пользовательскую функцию в группе по

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

Однако, после того, как в день рыть и пробовать различные пути и решения, я пришел к выводу, что это невозможно сделать с основными данными в одном SQL выборки. Я использую NSFetchRequest с setPropertiesToGroupBy (только для 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. 

ответ

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 (*) добавить в NSExpression к вашему fetchRequest:

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

Спасибо, попробую. Обратите внимание, что NSFetchedResultsController часто используется с делегированием, обязательным или необязательным является назначение делегата NSFetchedResultsController? Могу ли я использовать его так же, как NSFetchRequest? – Centurion

+0

Делегат не является обязательным. См. Документацию: «Экземпляр NSFetchedResultsController использует методы в этом протоколе для уведомления своего делегата о том, что результаты выборки контроллера были изменены из-за операций добавления, удаления, перемещения или обновления. Например, в UITableView вы использовали бы его для обновить строки и раздел после изменения набора данных – Olaf

Смежные вопросы