8

Objective-C で NSFetchRequest を作成するときに、グループごとにカスタム関数 (strftime) を使用することは可能ですか? SQL ステートメントは sqlite で完全に有効です。

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

ただし、さまざまな方法と解決策を掘り下げて試した1日の後、単一のSQLフェッチでコアデータを使用してそれを行うことは不可能であるという結論に達しました。setPropertiesToGroupBy で NSFetchRequest を使用しています (iOS 5.0 のみ)。

アップデート。アップルが提供するコアデータを使用してこのような動作を取得する例があります。ただし、コア データによって実行される SQL を表示するために「-com.apple.CoreData.SQLDebug 1」を有効にしました。コア データが目的の SQL を実行していないようです。最初のSQLクエリでそれらをすべて選択し、複数の「SELECT .. 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

1 に答える 1

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"]]];
于 2012-07-04T15:01:41.333 に答える