CoreData基礎:アーキテクチャ

2007/03/30 (Fri) 22:07:46 JST

大部分のアプリケーションでは、オブジェクトを保存したファイルを開き、根幹となるなんらかのオブジェクトへの参照を得る必要があります。また、すべてのオブジェクトをファイルに保存できるよう実装する必要もあり、アンドゥをサポートしたければオブジェクトの変更を追跡する必要があります。

従業員管理アプリケーションでは、従業員・部署オブジェクトの保存されたファイルを開き、図 2 のようにすべての従業員オブジェクトの配列への参照を得る必要があります。また、すべての従業員・部署オブジェクトをファイルに保存できるよう実装する必要があります。

アプリケーション全体もしくは一部でそのような処理を行うために、コードを書かなければいけません。Cocoaのドキュメントのためのアーキテクチャは、その負担を軽減する構造と機能を提供しますが、それでも次の機能をサポートするメソッドを実装しなくてはなりません。その機能とは、データの保存とロード、アンドゥをサポートするためのモデルオブジェクトの変更の管理とアンドゥマネージャの使用です。

Core Dataフレームワークの使用時、ほとんどの機能は管理オブジェクトコンテキスト (以下コンテキスト) いうオブジェクトを通して自動的に使われます。管理オブジェクトコンテキストは、フレームワークの管理するオブジェクト群 (永続化スタック) への入口となり、アプリケーションと外部データストア間の仲介役になります。永続化スタックの際下部は 永続化オブジェクトストア があります (図 3) 。

Core Dataはドキュメントべースアプリケーションに限定されないことに注意してください。ユーザーインターフェースのまったくないCore Dataのユーティリティを作ることも可能なのです (Low-Level Core Data Tutorialを参照) 。 Core Dataは他のアプリケーションでも使われています。

管理オブジェクトコンテキスト

管理オブジェクトコンテキストを賢いスクラッチパッドと考えることもできます。永続化ストアからオブジェクトをフェッチすると、スクラッチパッド上に一時的なコピーを持つことになります。このスクラッチパッド上のオブジェクトは自由に変更することができ、変更を保存するまで永続化ストアには反映されません。

Core Dataフレームワークとの架け橋となるオブジェクトが管理オブジェクトです。管理オブジェクトはすべて管理オブジェクトコンテキストに登録しなければなりません。オブジェクトグラフにオブジェクトを追加したり削除する作業は、コンテキストを使って行います。コンテキストは、オブジェクトの変更、つまりオブジェクトの属性とリレーションシップの変更を追跡します。 変更を追跡することでコンテキストがアンドゥとリドゥを行えるようになり、またリレーションシップを変更してもオブジェクトグラフの整合性を維持することができます。

変更を保存すると、コンテキストはオブジェクトを妥当な状態にします。オブジェクトが妥当な状態であれば、変更を永続化ストアに書き込み、生成したオブジェクトを新しいレコードとして (永続化ストアに) 追加し、削除予定のオブジェクトに対応するレコードを (永続化ストアから) 取り除きます。

フェッチ要求

管理オブジェクトコンテキストを使ってデータを得るには、フェッチ要求を生成します。フェッチ要求は、「すべての従業員」や「マーケティング部署に所属するすべての従業員を、給与の高いほうから順に並べる」など、取得したいデータを指定するオブジェクトです。フェッチ要求は三つのデータを持ちます。 まず、最低限エンティティ名を指定する必要があります (一度に一つのエンティティのみフェッチできます) 。さらに、述語オブジェクトとソート設定オブジェクトの配列を持ちます (図4) 。述語オブジェクトはオブジェクトにマッチする条件を指定し、ソート設定オブジェクトはフェッチしたオブジェクトを並び替える順序を指定します。

次に、フェッチ要求を管理オブジェクトコンテキストに渡します。 コンテキストは、永続化ストアと協調するデータソースから、要求に適合するオブジェクトを見つけて返します。 管理オブジェクトは、フェッチに使用した管理コンテキストに登録されてから返されます。

フレームワークは可能な限り効率的な処理を試みます。Core Dataは要求を受け取ってから動作するフレームワークであり、必要以上にオブジェクトを生成することはありません。オブジェクトグラフも永続化ストアにあるオブジェクトをすべて持つ必要はなく、永続化ストアもデータオブジェクトを管理オブジェクトコンテキストに持たせることはしません。

永続化ストアからオブジェクトのサブセットをフェッチすると、要求したオブジェクトのみを取得できます。 オブジェクトの、まだフェッチされていないリレーションシップをたどると、自動的にリレーションシップがフェッチされます。オブジェクトを使うのをやめれば (そのオブジェクトがretainされていなければ) 、いずれ解放されます (ただし、オブジェクトグラフからの削除ではありません) 。


Inverse Pages: CoreData基礎