甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

NSFetchRequestが返す結果のタイプを設定する

NSFetchRequestクラスのインスタンスメソッドexecuteFetchRequest:error:によってフェッチ処理を行うことができる。フェッチ結果は配列(NSArrayオブジェクト)形式で得られる。この配列の各要素はデフォルトではNSManagedObjectオブジェクトだが、フェッチ実行前にNSFetchRequestオブジェクトにsetResultType:でフェッチ結果のタイプを設定しておくと、NSManagedObjectオブジェクト以外の形式でフェッチ結果を取得することも可能である。

フェッチ結果のタイプ(NSFetchRequestResultType)

setResultType:でFetch Requestに設定することができるフェッチ結果タイプにはiOS 5.0現在で次の4つがある。ただし、NSCountResultTypeはiOS 5.0以降でのみ使用することができる。それ以外はiOS 3.0以降で使用可能だ。

  • NSManagedObjectResultType (0x00)
  • NSManagedObjectIDResultType (0x01)
  • NSDictionaryResultType (0x02)
  • NSCountResultType (0x04)

NSFetchRequestResultTypeはCoreData/NSFetchRequest.hで定義されている。

NSManagedObjectResultType (0x00)

このタイプが設定されている場合、NSManagedObjectオブジェクトの配列がフェッチ結果として得られる。NSManagedObjectResultTypeの値が0x00と定義されていることから明らかなように、setResultType:で他のタイプが指定されていない限りこのタイプが使用されることになる。

NSManagedObjectIDResultType (0x01)

このタイプが設定されているときには、NSManagedObjectIDオブジェクトの配列がフェッチ結果として得られる。Object IDに対応するManaged Objectを得るためには、NSManagedObjectContextクラスのインスタンスメソッドobjectWithID:を使用する。
NSManagedObjectIDResultTypeを指定している場合は、Fetch Requestに対してsetSortDescriptors:でフェッチ結果のソートに関する設定を行なっている場合でも、フェッチ結果が指定通りの並びになるとは限らない点に注意。*1

NSDictionaryResultType (0x02)

このタイプが設定されると、フェッチ結果は、属性名をキー、属性値を値とするNSDictionaryオブジェクトの配列となる。関連はデフォルトでは含まれないのでsetPropertiesToFetch:で事前にフェッチ対象のプロパティとして設定しておく必要がある。*2

NSCountResultType (0x04)

このタイプが設定されると、フェッチ結果は1つのNSNumberオブジェクトを含む配列となる。このNSNumberオブジェクトの値はフェッチ条件に合致するManaged Objectの数である。

*1:NSFetchRequest Class ReferenceのresultTypeの項目を参照。

*2:NSFetchRequest Class ReferenceのsetPropertiesToFetch:の項目を参照。