LoginSignup
53
56

More than 5 years have passed since last update.

[Objective-C] NSFetchedResultsControllerを使ってCoreDataを便利にする

Posted at

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];

参考にした記事

53
56
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
53
56