前回は、画像登録時のペースト機能を復活させ、タップ認識に「UIGestureRecognizer」を使うようアプリケーションを改良してみました。今回から数回に渡り、本アプリケーションのモデルクラスにCoreDataフレームワークを用いるよう改良を行います。
本アプリケーションのModelクラスには、各プロパティ(オブジェクト)をアーカイブ形式に変換したり、逆にアーカイブからオブジェクトへと復帰させたりする仕組みが実装されています。その処理を担当しているのがModelクラスの以下の2つのメソッドです。
- (void)encodeWithCoder:(NSCoder *)coder // プロパティをアーカイブ化
- (id)initWithCoder:(NSCoder *)coder // アーカイブからプロパティを復帰
そしてDocumentクラスの以下のメソッドで、アーカイブ化したModelオブジェクトの配列(NSArray)をファイルへ保存したり、ファイルから読み込んだアーカイブを最度オブジェクト配列へ復帰させたりしています(データベースファイルのセーブとロード)。
- (BOOL)save // ドキュメントファイルへの書き出し
{
BOOL ret=NO;
if( do_array )
ret=[NSKeyedArchiver archiveRootObject:do_array toFile:[self path]]; // do_array配列をアカーブ化しAandA.archiveファイルへ保存
return ret;
}
- (BOOL)load // ドキュメントファイルの読み込み
{
BOOL ret=YES;
NSString *path;
path=[self path]; // Symmetry.archiveファイルのパスを得る
if( [[NSFileManager defaultManager] fileExistsAtPath:path]==YES ) // Symmetry.archiveファイルがあるか?
{
self.do_array=[NSKeyedUnarchiver unarchiveObjectWithFile:path]; // Symmetry.archiveからdo_arrayt配列から読み込む
if( ! do_array )
ret=NO;
}
else
ret=[self create];
return ret;
}
つまり、モデルクラスにCoreDataフレームワークを採用するということは、こうした処理にCoreDataのデータベース形式とメソッド(能力)を活用すると言うことです。具体的には、本アプリケーションのModelクラスとDocumentクラスを大きく変更することになります。この両クラスの変更は他のクラスの構造にも幾らか波及しますが、それほど影響は大きくないと予想されます。
CoreDataを利用する場合には、まず最初にモデルクラスの設計図を記述する必要があります。この仕事はXcodeで行います。具体的には「Symmetry.xcdatamodel」ファイルを編集し、モデルクラスの設計とレイアウトを行います。このファイルの雛形は、Xcodeの新規プロジェクトで作成したテンプレート(雛形)プロジェクトから吸い上げます。この時、テンプレート選択のダイアログで「Use Core Data for storage」をチェックしておくのを忘れないでください。自分自身のプロジェクトに登録したらファイル名を変更しておきます。

実はこのファイルはパッケージ形式になっており、.xcdatamodeldパッケージ内に複数の.xcdatamodelファイルが保存できます。今回は、Symmetry.xcdatamodeldパッケージにSymmetry.xcdatamodelファイルが1つだけ入った状況で利用します。


プロジェクトのファイル一覧からSymmetry.xcdatamodelをダブルクリックするとモデルクラス設計用のエディタがオープンします。この初期状態を雛形として、本アプリケーションのモデルクラスをそのまま設計に反映させていきます。

まずはエンティティの編集です。エンティティ名は「Model」とし、対象となるクラス名も「Model」に変更します。


続いて各プロパティの編集です。プロパティの名称は、今までModelオブジェクトで利用してきた物をそのまま使います。続いて、プロパティが如何なる属性なのかを、ひとつひとつ設定していきます。例えば「md_name」プロパティであれば、その属性のデータ型は「文字列」(オブジェクト的にはNSString)となります。



こうして全てのプロパティを設定し終わると、下のグラフ領域に以下の様なチャートが表示されることになります。

もし複雑なデータベースを構築するような場合には、更に新しいエンティティを追加し、それぞれのエンティティが互いにどう関連しているのかも指示する必要があります(お互いをリンクさせる)。例えば、以下はApple社が提供しているサンプルソースコード「PhoneCoreDataRecipes」のモデルクラスのレイアウトです。自作アプリケーションのモデル設計の参考にしてみてください。

今回は、Xcodeのクラス設計用のエディタを使いSymmetry.xcdatamodelファイルを編集しました。次回は、このレイアウトに合わせてModelクラス(Model.hやModel.m)の再実装とUIImageオブジェクトの変換処理について解説します。