More iPhone 3 Development: Tackling iPhone SDK 3 (Beginning) Chapter 7 のまとめ。
最終章は、関連(Relationship)、取得済みプロパティ(Fetched property)について。さらに、流用がしやすいように汎用的なViewControllerの設計について考える。内容が多いので、まずはRelationshipから。
続きはこちら。
Chapter 7 : 取得済みプロパティ(Fetched property)
関連/Relationships
ある Managed Object が別の Managed Object を参照することをRelationship(関連)という。RelationshipもAttributeと同じCore Dataのプロパティであり、Key-Valueによりアクセスされる。
対多関連ではない/To-One Relationsihps
あるManaged Objectが、他のひとつのManaged Objectを参照する場合。Relationshipへのアクセスは、KVCを用いてもアクセサメソッドを用いてもよい。
対多関連/To-Many Relationsihps
あるManaged Objectが、他のManaged Objectの集合を参照する場合。Managed Objectの集合はNSSetで表現される(Managed Objectを追加/削除する場合はNSMutableSetを用いる)。ここで、NSSetはNSArrayと違い、並び順が固定でないことに注意が必要。ソートするために、NSArrayクラスを拡張しNSSetからソート済みNSArrayを取り出せるようにしておくと便利。
To-Many relationshipを参照するだけのときは、Attributeと同様 valueForKey: を用いる。
NSSet *children = [person valueForKey:@"children"];
一方、To-Many relationshipを変更する場合は、mutableSetValueForKey: を用いる。
NSMutableSet *children = [person mutableSetValueForKey:@"children"];
mutableSetValueForKey: は、valueForKey: より少しだけオーバーヘッドが大きいので、変更時以外は使わないようにする。
また、Entityのクラスとして、独自のNSManagedObjectサブクラスを生成すれば、以下のメソッドが用意される。
- (void)addXxxObject:(NSManagedObject *)value;
- (void)removeXxxObject:(NSManagedObject *)value;
- (void)addXxx:(NSSet *)value;
- (void)removeXxx:(NSSet *)value;
なお、これらのメソッドは動的メソッドでありランタイムに生成されるためコードは存在しない。
逆関連 (Inverse Relationships)
Relationshipにはその逆(Inverse)が存在する。Appleは原則としてすべてのRelationshipにInvers relationshipを設定することを推奨している(実際、Inverse relationship を設定しないとコンパイル時に Warning が出る)。ただし、Relationship Object の規模が非常に大きく削除時に時間がかかるなど、もしパフォーマンスの問題に直面したら、Invers Relationship をはずしてみるのは一つの手かもしれない。
削除ルール (Delete Rules)
他のオブジェクトから関連づけられているオブジェクトが削除された際にどのような振る舞いになるかを決める4つのルールが存在。
無効にする/Nullify
デフォルトルール。関連づけられているあるオブジェクトが削除された場合、そのInvers relationship が To-One relationshipの場合nilに設定され、To-Manyの場合、NSSetの中から該当するオブジェクトが削除される。
アクションなし/No Action
Relationship が削除されても他のオブジェクトは何も変化しない。このルールが用いられるのは非常にまれであり、主に、逆関連のない一方通行の関連でのみ用いられる。
カスケード/Cascade
あるオブジェクトが削除された場合、そのオブジェクトが持つ Relationship がすべて削除される。主に、Inverse relationship がTo-Oneで、かつ、その Relationship が他のオブジェクトからは利用されていない場合に用いられる。この場合、不要なオブジェクトを残しておかないように、カスケードルールを用いて一緒に削除する。
拒否/Deny
そのオブジェクトが削除されないようにするオプション。
まとめ
Relationshipの概念を理解した。はじめはわかりにくい気がしたが、いざ手を動かしてみると徐々に理解できる。一番注意すべきは削除ルールの設定方法かな。あとは実践あるのみ。
Apress
売り上げランキング: 29207



