HOME » Natsu note » 古い投稿 » Core Data 勉強日記 (12):More iPhone 3 Development / chapter 7 (取得済みプロパティ/Fetched Property)

Core Data 勉強日記 (12):More iPhone 3 Development / chapter 7 (取得済みプロパティ/Fetched Property) 2010/02/25/|古い投稿

この記事は情報が古い可能性があります。参照する際にはご注意ください。

More iPhone 3 Development: Tackling iPhone SDK 3 (Beginning) Chapter 7 のまとめ。

前回の Chapter 7 : 関連 (Relationship) に続き、ここでは取得済みプロパティ(Fetched property)について。

取得済みプロパティ/Fetched Properties

Entity に追加できるプロパティの種類として取得済みプロパティ(Fetched Property)というものがある。これは、ある条件に一致するManagedObjectだと思えばよい。なお、Fetched Property は常に不変(immutable)である。条件はデータモデル内に設定され、ランタイムにオブジェクトの内容を書き換えることもできない。


To-Many Relationship と異なり、Fetched Property はソートが可能である。
ただし、ソート順に関する指定はデータモデルエディタでは行えないのでコードで実装する必要がある。ソート方法は7章後半に記載、と書いてあったが、そのような内容が見当たらなかった(読み飛ばした??)。

Fetched Property のソート方法に関しては、この2番目の回答が参考になりそう。
How to sort Core Data fetched properties (stack overflow)

Fetched Propertyへのアクセス

Fetched Property へのアクセスは、KVCを用いても(valueForKey: で取得)プロパティを用いても(NSManagedObjectのサブクラスを実装した場合)可能である。なお、Fetched Property は NSArray で表現されている。したがって、

NSArray *olderPeople = [person valueForKey:@"olderPeople"];
NSArray *olderPeople = person.olderPeople;

のいずれかの方法でアクセスすることになる。

条件設定

Fetched Property を追加したら、まず条件を設定しなくてはならない。この設定は、右のほうにある「述語を編集」(Edit Predicate)ボタンから行う(この辺りの日本語、いまいちピンとこない・・・)。このボタンを押すとPredicate Editorなるものが開く。このUIを使って、条件を設定していけばいい。

基本的にプルダウンメニューから該当する値や条件を選べばいいのだが、知らないと困ることがいくつかある。

まず、一番左のメニューから比較元を選ぶ。Fetched Property のクラスが持つAttributeがすべて出てくる。これは問題ない。
次に、その隣の条件式を選ぶ。これもおそらく問題ない。
問題はその次。条件式を記述するのだが、デフォルトでは定数を記述するようになっている。例えば、数字なら「20以上」とか、そういう感じだ。しかし、ここで設定できるのはそれだけではない。

定数の入力欄と、その隣にあるマイナスボタンの間あたりを右クリック(またはCtrl+クリック)すると、以下のようなプルダウンメニューが出てくる。ここで、「変数」や「キー」を選ぶことで、比較先の指定ができる。

PredicateEditor

なお、ここで選べる3種類の値が持つ意味は以下。

定数

文字通り定数を指定。一度設定した値は変更できない。

キー

フェッチされたオブジェクトが持つキー。

変数

実行時に評価される式を設定。特定のAttributeを指定するためにkeypathを設定することも可能。なお、Fetched Objectを持つ自分自身を指すためには、$FETCH_SOURCEを用いる。ただし、この「変数」欄を用いると、Predicate Editorが勝手に"$"を追加するため、実際には"FETCH_SOURCE"と記述すればよい。また、Fetched Propertyを指す$FETCHED_PROPERTYという変数も用意されている。詳細はこちらに。Core Data Programming Guide : Relationships and Fetched Properties

例えば、以下の条件式は、「自身の birthDate より小さい(古い)birthDate を持つ Entity」となる。

FetchedProperty Predicate

なお、条件式を直接 Predicate Editor に入力することもできる。一番左のプルダウンメニューから「式」を選べばよい。

PredicateEditor2

自身のオブジェクトを除外

Fetched Property に含まれるのは、条件式に合致するすべてのオブジェクトだ。したがって、自分自身(そのFetched Propertyを持つオブジェクト)も含まれてしまうことがある。これを避けるためには、条件式に以下を追加すればよい(ANDで追加)。

SELF != $FETCH_SOURCE

まとめ

ある条件に一致するオブジェクトの集合を取得するときには Fetched Property を使うとよい。また、今回は深入りしていないが、NSExpression を使うと、平均値、最大値、最小値など、簡単な算術結果を効率的に(すべてのオブジェクトにアクセスすることなく)計算できるみたい。これに関しては今後の課題。

More iPhone 3 Development: Tackling Iphone Sdk 3 (Beginning)
Dave Mark Jeff Lamarche
Apress
売り上げランキング: 29207