私は Core Data を初めて使用するので、いくつかのフィールドとそのグループ内の別のフィールドの数で結果をグループ化する単純なフェッチ要求を書きたいと考えています。たとえば、製品テーブルがあり、グループ化されたすべての製品を日付と製品の数で取得したい場合、SQL の単純なクエリは次のようになります。
SELECT DateRegistered,Count(*) FROM Products Group By DateRegistered
私は Core Data を初めて使用するので、いくつかのフィールドとそのグループ内の別のフィールドの数で結果をグループ化する単純なフェッチ要求を書きたいと考えています。たとえば、製品テーブルがあり、グループ化されたすべての製品を日付と製品の数で取得したい場合、SQL の単純なクエリは次のようになります。
SELECT DateRegistered,Count(*) FROM Products Group By DateRegistered
あなたの最善の策は、非常に柔軟NSFetchedResultsController
です。日付属性でソートされた Product エンティティを単純にフェッチするフェッチ リクエストがあります。コア データ属性は小文字で始める必要があることに注意してください。
次のようなものを使用して、フェッチされた結果コントローラーを作成します。これは通常、ビュー コントローラーで遅延して作成される Apple サンプル コード (Xcode テンプレートを含む) を確認してください。
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
request.sortDescriptors = @[ [NSSortDescriptor
sortDescriptorWithKey:@"dateRegistered"
ascending:YES] ];
_fetchedResultsController = [NSFetchedResultsController
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:@"dateRegistered"
cacheName:"Root"];
これは、日付が実際に毎日同じである場合にのみ機能します。NSDate
タイプが秒単位で正確になり、各「グループ」で1つカウントされるように、おそらく文字列を使用することをお勧めします。
フェッチされた結果コントローラーを使用すると、必要なすべての数値に簡単にアクセスできます。たとえば、「グループ」番号の数i
(正しい用語は「セクション」です):
id <NSFetchedResultsSectionInfo> sectionInfo =
[[_fetchedResultsController sections] objectAtIndex:i];
int count = [sectionInfo numberOfObjects];
フェッチされた結果コントローラーを使用すると、さらに多くのことができます! メモリを管理し、UI (テーブル ビューやコレクション ビューなど) での表示を容易にし、永続ストアへの負担を最小限に抑えます。