Apple Developer Connection
Advanced Search
Member Login Log In | Not a Member? Contact ADC


Core Data に関する FAQ

本稿では、Core Data に関するよくある質問に対する回答を提供します。

このセクションの内容:

管理対象オブジェクトコンテキストはどこから来るのでしょうか
エンティティ A からエンティティ B への対多関係があります。エンティティ A の任意のインスタンスに関連するエンティティ B のインスタンスはどのように受信すればよいのでしょうか
コンテキスト間で管理対象オブジェクトをコピーするにはどうすればよいでしょうか
エンティティを抽象化するべき理由を教えてください
非ドキュメントアーキテクチャベースのアプリケーションでアンドゥ/リドゥ機能をただで手に入れるにはどうすればよいでしょうか
データモデリングツールの中でエンティティに基づいてユーザインターフェイスを作成するにはどうすればよいでしょうか
Xcode の述語ビルダの中で、受信済みプロパティ述語のプロパティが表示されないのはなぜでしょうか
配列コントローラで管理されている詳細テーブルビューからオブジェクトを取り除いても、オブジェクトグラフから取り除かれないのはなぜでしょうか
GUI でユーザが入力したデータを検証するにはどうすればよいでしょうか
Core Data は EOF と似ているように見えます。違いは何でしょうか

管理対象オブジェクトコンテキストはどこから来るのでしょうか

管理対象オブジェクトがどこから来るかは、完全にアプリケーションに依存しています。NSPersistentDocument を使用する、Cocoa のドキュメントベースアプリケーションでは、永続ドキュメントが一般的にコンテキストを作成し、そのコンテキストに managedObjectContext メソッドを使用してアクセスできるようにします。

シングルウインドウアプリケーションでは、標準のプロジェクトアシスタントを使用してプロジェクトを作成すると、アプリケーションデリゲート(AppDelegate クラスのインスタンス)がコンテキストを作成し、そのコンテキストに managedObjectContext メソッドを使用してアクセスできるようにします。しかし、この場合は、コンテキスト(および Core Data スタックの残り)を作成するコードは明示的です。コードはテンプレートの一部として自動的に書き出されます。

エンティティ A からエンティティ B への対多関係があります。エンティティ A の任意のインスタンスに関連するエンティティ B のインスタンスはどのように受信すればよいのでしょうか

その必要はありません。もっと具体的にいうと、デスティネーションインスタンスを明示的に受信する必要はなく、エンティティ A のインスタンスを対象に適切なキー値コーディングまたはアクセサメソッドを呼び出すだけです。「widgets」という名前の関係が存在し、同じような名前のアクセサメソッドを持つカスタムクラスを実装した場合、単純に次のように書きます。

NSSet *asWidgets = [instanceA widgets];

あるいは、キー値コーディングを使用します。

NSSet *asWidgets = [instanceA valueForKey:"widgets"];

コンテキスト間で管理対象オブジェクトをコピーするにはどうすればよいでしょうか

まず、厳密な意味では、オブジェクトをコピーすることにならない点に注意してください。概念的には、永続ストアの同じ基礎データへの追加の参照を作成していることになります。

コンテキスト間で管理対象オブジェクトをコピーするには、次の例に示すように、オブジェクトのオブジェクト ID を使用することができます。

NSManagedObjectID *objectID = [managedObject objectID];
NSManagedObject *copy = [context2 objectWithID:objectID];

エンティティを抽象化するべき理由を教えてください

インスタンス化するべきでない共通エンティティを特殊化したものを表すエンティティがいくつかある場合には、エンティティを抽象化します。たとえば、ある描画アプリケーションに、x と y 座標、色、および描画範囲の属性を定義した Graphic エンティティがあるとします。しかし、Graphic は決してインスタンス化できないとします。Graphic のサブエンティティとして Circle、TextArea、および Line があると考えることができます。

多くの場合、具象エンティティを表すクラスが継承する抽象エンティティに対応するためにカスタムクラスも実装します。すべてのクラスに共通する検証メソッドおよび他のビジネスロジックを何度も実装するのではなく、これらを一か所に実装して、サブクラスで継承します。

非ドキュメントアーキテクチャベースのアプリケーションでアンドゥ/リドゥ機能をただで手に入れるにはどうすればよいでしょうか

Core Data ドキュメントベースのアプリケーションでは、NSDocument のアンドゥマネージャがドキュメントの管理対象オブジェクトコンテキストのアンドゥマネージャで置き換えられます。非ドキュメントベースのアプリケーションでは、ウインドウのデリゲートは、windowWillReturnUndoManager: デリゲートメソッドを使用して管理対象オブジェクトコンテキストのアンドゥマネージャを提供することができます。ウインドウデリゲートに管理対象オブジェクトコンテキストへのアクセサメソッドがある場合は(Core Data アプリケーションテンプレートを使用している場合はあります)、windowWillReturnUndoManager: を次のように実装します。

- (NSUndoManager *) windowWillReturnUndoManager:(NSWindow *)sender {
    return [[self managedObjectContext] undoManager];
}

データモデリングツールの中でエンティティに基づいてユーザインターフェイスを作成するにはどうすればよいでしょうか

データモデリングツールの中でエンティティに基づいてユーザインターフェイスを作成するには、Xcode のデータモデルツールの中で Option キーを押しながらエンティティをクリックし、Interface Builder 内のウインドウまたはボックスまでドラッグします。例については、『NSPersistentDocument Core Data Tutorial』を参照してください。

これを実行するとき、Xcode をフォアグラウンドアプリケーションにする必要があります。フォアグラウンドにないときに、Option キーを押しながら Xcode をクリックすると、Xcode がフォアグラウンドになり、Interface Builder を含め、他のアプリケーションがすべて非表示になります。

Xcode の述語ビルダの中で、受信済みプロパティ述語のプロパティが表示されないのはなぜでしょうか

Xcode の述語ビルダの中で受信済みプロパティの述語を作成したいのにプロパティが表示されない場合は、おそらく受信済みプロパティのデスティネーションエンティティを設定していません。

配列コントローラで管理されている詳細テーブルビューからオブジェクトを取り除いても、オブジェクトグラフから取り除かれないのはなぜでしょうか

配列コントローラを使用して関係のデスティネーションであるオブジェクトのコレクションを管理している場合、デフォルトでは remove メソッドを実行すると、関係から現在の選択範囲が取り除かれます。取り除いたオブジェクトをオブジェクトグラフから削除したければ、contentSet バインディングの「Deletes Objects On Remove」オプションを有効にする必要があります。

(これが特に関係するのは、Xcode のデータモデリングツールからエンティティをドラッグして、ユーザインターフェイスを作成する場合です。例については、『NSPersistentDocument Core Data Tutorial』を参照してください。)

GUI でユーザが入力したデータを検証するにはどうすればよいでしょうか

管理対象オブジェクトコンテキストに save: メッセージを送られると、Core Data がすべての管理対象オブジェクトを検証します。Core Data ドキュメントベースのアプリケーションでは、これはユーザがドキュメントを保存するときです。Interface Builder のバインディングインスペクタの中で値バインディングの「Validates Immediately」オプションを選択することで、データの入力に伴って GUI にオブジェクトを検証させることができます。バインディングをプログラムで設定する場合は、バインディングオプションディクショナリで @"NSValidatesImmediately" キーに(NSNumber として)YES の値を渡します(「Binding Options」を参照)。

カスタムの検証メソッドを記述する方法の詳細については、NSManagedObject の「Subclassing Notes」を参照してください。

Core Data は EOF と似ているように見えます。違いは何でしょうか

Core Data と EOF(WebObjects に付属している Enterprise Objects Framework)は共通の遺産を共有していますが、目的が異なります。EOF は Java ベースのフレームワークであり、クライアントとしてデータベースサーバに接続します。Core Data は Objective-C ベースのフレームワークであり、デスクトップアプリケーションの開発を支援することを目的とするものです。Core Data は、EOF ではサポートされていない機能をいくつかサポートしており、逆もまた同様です。

EOF でのみサポートされている機能

EOF では、カスタム SQL、共有編集コンテキスト、およびネスト編集コンテキストを使用できます。Core Data には、EOModelGroup に相当するものはありません。NSManagedObjectModel クラスは、既存のモデルからモデルをマージするためのメソッド、およびバンドルからマージされたモデルを取り出すためのメソッドを提供します。

EOF では関係の事前受信および一括フォールティングをサポートしていますが、Core Data ではサポートしていません。

Core Data でのみサポートされている機能

Core Data では、受信済みプロパティ、管理対象オブジェクトモデル内のマルチ構成、ローカルストア、ストア集合(特定エンティティのデータを複数のストアに分散できます)、プロパティ名と検証警告のカスタマイズとローカライズ、プロパティ検証での述語の使用をサポートしています。

クラスのマッピング

Core Data と EOF のクラスの多くには類似点があります。





Preliminary Last updated: Tiger




Did this document help you?
Yes: Tell us what works for you.

It’s good, but: Report typos, inaccuracies, and so forth.

It wasn’t helpful: Tell us what would have helped.
Get information on Apple products.
Visit the Apple Store online or at retail locations.
1-800-MY-APPLE

Copyright © 2007 Apple Inc.
All rights reserved. | Terms of use | Privacy Notice