管理オブジェクトの生成、フェッチ、更新
2007/03/30 (Fri) 22:07:46 JST
管理オブジェクトコンテキストを生成すると、管理データオブジェクトの生成、フェッチ、更新ができるようになります。
管理オブジェクトの生成と使用
Core Dataによって管理されるデータオブジェクトは、管理オブジェクトコンテキストやエンティティ定義と協調して動作する必要があります。 エンティティ定義は、コンテキストに従って動作する管理オブジェクトモデルの一部です。 管理オブジェクトは?NSEntityDescriptionクラスのあるメソッドで生成します。 例えばBookエンティティに属する新しいBookオブジェクトを生成するには、次のようにします。
NSManagedObject *book = [NSEntityDescription insertNewObjectForEntityName:@"Book" inManagedObjectContext:context];
このメソッドは引数のコンテキストからオブジェクトモデルを取得し、Bookエンティティに属する管理オブジェクトを生成します。 生成した管理オブジェクトは、Key-Value Coding (KVC) のメソッドでデータにアクセスしたり変更することができます。 次のコードは本のタイトルを設定する例です。
[book setValue:@"Tea Time with Moby" forKey:@"title"];
続けて本のタイトルを取得するには次のようにします。
[book valueForKey:@"title"];
KVCメソッドを使うと、Cocoaバインディングを使った画面表示や、管理オブジェクトが持つデータの操作が簡単になります。 実際、モデルを定義してInterface Builderでデータとモデルをバインドすれば、まったくコードを書くことなく、多くのシンプルなアプリケーションを作ることができます。
アンドゥ/リドゥの管理
これまでのCocoaアプリケーションのアンドゥ/リドゥの機能は、データの変更のような行動をすべてアンドゥマネージャに手動で登録することで実現してきました。 Core Dataでは管理オブジェクトコンテキストがアンドゥマネージャを管理するため、このようなコードを書く必要がありません。 アンドゥマネージャはKey-Value Observing (KVO) を使って、登録されたオブジェクトの変更を追跡します。 アンドゥ、リドゥを実行すると、アンドゥマネージャはコンテキストを以前の状態に戻します。
変更の保存
Core Dataが管理するオブジェクトの変更はメモリ中で行われるもので、ディスクにコミットするまでは一時的な変更に過ぎません。 データモデルへの変更をディスクにコミットするには、管理オブジェクトコンテキストにsave:メッセージを送ります。 これによりドキュメントベースアプリケーションでも、ユーザにとって不自然なく文書の整合性を保つことができます。
管理オブジェクトのフェッチ
管理オブジェクトコンテキストで既存のデータを扱うには、欲しいデータの条件を指定してフェッチ要求を行います。 例えばコンテキストに「すべての本」や「ある著者の本のみ、それをラストネームで降順に並び替える」などのように問い合わせることができます。
フェッチの要求は次の3つのパートで構成されます。
- 取得するオブジェクトが属するエンティティ名
- 取得するオブジェクトが持つ、または持たない属性やリレーションシップを指定する任意の述語
- 取得するオブジェクトを並び替える条件を指定する任意の配列
フェッチ要求のテンプレートは、Xcodeデータモデルデザインツールで生成される管理オブジェクトモデルに含まれます。 このツールを使うと、フェッチ要求と述語を簡単に作成できます。 管理オブジェクトモデルの一部として生成されるフェッチ要求は、管理オブジェクトモデルからフェッチを行うことができ、次のように管理オブジェクトコンテキストと組み合わせて使われます。
NSFetchRequest fetchRequest = [model fetchRequestFromTemplateWithName:@"fetchBooks"]; NSArray *books = [context executeFetchRequest:fetchRequest error:&error];
Inverse Pages: DevelopingWithCoreData