HOME » Natsu note » 古い投稿 » Core Data 勉強日記 (9):More iPhone 3 Development / chapter 6 (カスタムモデルの生成)

Core Data 勉強日記 (9):More iPhone 3 Development / chapter 6 (カスタムモデルの生成) 2010/02/23/|古い投稿

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

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

より詳細なデータモデルを生成していく。基礎はChapter 3で説明されているが、ここではカスタムモデルの生成を行う。


このあたりの内容は、iPhoneCoreDataRecipesというサンプルコードを見るとかなり勉強になりそう。

Attributeの設定

まずはじめに、データモデルエディタで行える設定のうち、Chapter 3では触れなかった以下の2つについて補足。

Transient (一時) attribute

Attributeを生成した際に、「一時」オプションをつけておくと、このデータは保存されない(具体的には、保存に用いられるSQLite内にこの属性用の列ができない)。

Transformable (変換可能) type attribute

Attribute typeとして提供されていないデータ型を使いたい場合、データ型として「変換可能」(Transformable)を選択する。
変換可能型が選択されると、その Attribute は、データ保存時には NSData 型に変換される。したがって、NSDataへの変換を行うクラスを指定する必要がある。「値変換の名前 (value transformer class)」に、変換用のクラスを指定する。

デフォルト値は、NSKeyedUnarchiveFromDataとなっており、これは、NSKeyedArchiver, Nskeyedunarchiver により変換が行われることを意味する。したがって、NSCodingプロトコルが動作すればこのままで扱える。それ以外の場合は、自分で変換用のクラス(Value Transformer)を生成するしなくてはならない。

Value Transformer の生成

NSValueTransformerのサブクラスとして、独自の変換用クラスを生成する。この変換用クラスでは、

Attributeの型として利用したいクラス ←→ NSData

の双方向の変換を実現しなくてはいけない。

上書きするメソッドは以下の4つ。右に示すのは、例としてUIColor型のattributeを生成した場合の処理内容。

+ (Class)transformedValueClass return [NSData class]
+ (BOOL)allowsReverseTransformation return YES
– (id)transformedValue:(id)value UIColorからNSDataへ変換。
– (id)reversTransformedValue:(id)value NSDataからUIColorへ変換。

NSManagedObjectのサブクラスを作る(カスタム管理オブジェクト)

利点:
NSManagedObjectクラスをそのまま使っていると常にKVC(Key-Value-Coding)となり、タイプミスがあってもコンパイラが見つけられない。プロパティを使うことでより確実なコーディングができる。
また、デフォルト値の設定や、値の有効/無効判断等が行える。

カスタムモデルを生成するためには、まず、対象となる.xcdatamodelを選択した状態で新規ファイルの作成を行う。

Newfile for managedobject

新規ファイルのテンプレートが出てきたら、Mac OS X, Cocoa クラス, 管理オブジェクトクラス を選択する。
ここで、なぜか、"Cocoa クラス"が出てこないことがある。一度キャンセルし、もう一度新規ファイル作成を選ぶと出てくる。不思議。

以下の画面が出てきたら、サブクラスとして作成したいエンティティを選択して完了。エンティティと同名の.mと.hが生成される。

Newfile select entity

データモデル(.xcdatamodel)をデータモデルエディタで見てみると、エンティティのクラスがMSManagedObjectから、今作成したクラスに変更されていることがわかる。

Entity class changed

NSManagedObjectサブクラスの編集

生成されたサブクラスは、以下のような観点で適宜変更するとよい。

  • 変換可能(transformable)型のAttributeは、id型の変数として生成されるので、具体的な型に変更。
  • 一時(transient) Attributeのproperty宣言をreadonlyに変更。
  • awakeFromInsertを上書き(初期化処理はここに追加するとよい)
  • validateXxx:error: やvalidateForUpdateなどを上書き(バリデーションの処理とエラーの設定をここに追加。詳細は Chapter 6 (Validation)
More iPhone 3 Development: Tackling Iphone Sdk 3 (Beginning)
Dave Mark Jeff Lamarche
Apress
売り上げランキング: 29207