2012-07-04 31 views
8

當在objective-c中製作NSFetchRequest時,是否可以在組中使用自定義函數(strftime)? SQL語句是完全有效的源碼:核心數據:是否可以在組中使用自定義函數

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

然而,挖掘和嘗試各種途徑和解決方案的一天後,我得出的結論是不可能用單一SQL獲取核心數據,來做到這一點。我正在使用NSFetchRequest和setPropertiesToGroupBy(僅適用於iOS 5.0)。

UPDATE。有一個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. 

回答

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的一個實例使用方法,在此協議通知其委託該控制器的擷取結果是由於更改爲添加,刪除,移動,或例如更新operations.'在一個UITableView你會用它來在數據集被修改後更新行和部分 – Olaf

相關問題