NSFetchedResultsControllerを使うとCoreDataとUITableViewがとても便利になります。
基本的な使い方は分かってしまうと簡単です。
CoreDataを使う場合、NSFetchRequest
を作り、NSManagedObjectContext
からデータを取得します。
これを便利にラップしてくれるのがNSFetchedResultsController
です。
使い方は通常と同じようにまずNSFetchRequest
でリクエストを作ります。
(※ソートディスクリプタを使ってソートする必要があるようです)
そしてNSFetchedResultsController
オブジェクトを以下のメソッドを使って生成します。
- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest
managedObjectContext:(NSManagedObjectContext *)context
sectionNameKeyPath:(NSString *)sectionNameKeyPath
cacheName:(NSString *)name
fetchRequestは最初に生成したリクエストです。
contextはNSManagedObjectContextですね。
そして残り2つが便利なところです。
###sectionNameyKeyPath
ここにNSString
で文字列を渡すと、それでセクション分けされます。
nil
を渡すとセクション分けされず、すべてがひとつのセクションとなるデータ配列となります。
###cacheName
NSString
で文字列を渡すと、その名前でキャッシュを生成してくれます。
これを生成することで、DBへのアクセスをキャッシュしてくれるようになる機能です。
便利なところは、生成されたインスタンスはUITableViewで使うこと前提のオブジェクトになるので、sectionやrowなどのデータにアクセスしやすくなっている点でしょう。
###performFetch:
メソッドでデータを読み込む
###sections
でデータを取得
NSFetchedResultsController
には、sections
というプロパティがあり、これにはfetch後のセクショニングされたデータが入っています。(型はNSArray
)
定義を見ると、NSFetchedResultsSectionInfo
というプロトコルが実装されたオブジェクトのようです。
####定義抜粋
@protocol NSFetchedResultsSectionInfo
/* Name of the section
*/
@property (nonatomic, readonly) NSString *name;
/* Title of the section (used when displaying the index)
*/
@property (nonatomic, readonly) NSString *indexTitle;
/* Number of objects in section
*/
@property (nonatomic, readonly) NSUInteger numberOfObjects;
/* Returns the array of objects in the section.
*/
@property (nonatomic, readonly) NSArray *objects;
@end // NSFetchedResultsSectionInfo
sections
配列に格納されているのはNSManagedObject
のサブクラスです。
###objectAtIndexPath:
メソッドで個別データを取得
objectAtIndexPath:
メソッドを利用することで、デリゲートメソッド内のindexPath
をそのまま渡して個別データが取得できる。
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [managedObject valueForKey:@"text"];
###fetchした全体の数を取得する
fetchしたセクションをまたいだ全体の数を取得するには以下のようにします。
NSUInteger count = [resultsController.fetchedObjects count];
##参考にした記事