|
|
Log In | Not a Member? |
Contact ADC |
Core Data フレームワークは、データを持つ(モデル)オブジェクトの管理に必要な多くのメカニズムを実装する必要性をなくします。もっとも、Core Data フレームワークでは、モデルオブジェクトが NSManagedObject のインスタンスであるか、NSManagedObject を継承するクラスのインスタンスであり、Core Data インフラストラクチャに適切に統合される必要があるという要件が伴います。この文書ではまず、管理対象オブジェクトの作成に必要なインフラストラクチャの基本部品、および管理対象オブジェクトを簡単にインスタンス化して、インフラストラクチャに統合する方法について説明します。続いて、管理対象オブジェクトの作成に通常使用する簡易メソッドで構成されるプロセス、そして最後に管理対象オブジェクトを削除する方法について説明します。
管理対象オブジェクトの作成
管理対象オブジェクト作成の舞台裏
管理対象オブジェクトの削除
管理対象オブジェクトは Objective-C クラスのインスタンスです。この点から見れば、管理対象オブジェクトは他に使用するオブジェクトと違いはありません。alloc を使用するだけで、インスタンスを作成できます。管理対象オブジェクトは、以下の 3 つの点で他のオブジェクトと異なります。
NSManagedObject のインスタンス、または NSManagedObject を継承するクラスのインスタンスでなければなりません。
その管理対象オブジェクトコンテキストで定義された環境に存在します。
オブジェクトのプロパティを記述するエンティティ記述が関連付けられています。
原理的には、新しい管理対象オブジェクトを作成し、Core Data のインフラストラクチャに適切に統合するために、多くの作業を実行しなければなりません。しかし実際には、このような作業を容易に行えるようにする、NSEntityDescription の簡易クラスメソッド(insertNewObjectForEntityForName:inManagedObjectContext:)があります。以下の例で、「Employee」という名前のエンティティの新しいインスタンスを作成する最も簡単な方法を示します。
|
このメソッドは、エンティティを表すために管理対象オブジェクトモデルに定義されている任意のクラスのインスタンスを返します。
ほとんどのアプリケーションでは、必要な作業はこれだけです。通常、エンティティには永続ストアが 1 つしかなく、Core Data は新しいオブジェクトをそこに保存することを自動的に保証します。しかし、特定のエンティティに複数の書き込み可能なストアが存在する場合もあります。たとえば、一部のデータを特定のドキュメントに保存し、一部を共通のグローバルリポジトリ(たとえば、ユーザの Application Support フォルダのストア)に保存することができます。このような状況では、オブジェクトを格納するストアを指定する必要があります。これを行うには NSManagedObject メソッド、assignObject:toPersistentStore: を使用します。永続ストアコーディネータからストア ID を取得するには、たとえば persistentStoreForURL: を使用します。以下の例では、新しい管理対象オブジェクトを作成し、グローバルストアに割り当てるプロセス全体を示します。
|
もちろん、管理対象オブジェクトコンテキストが保存されるまで、オブジェクトはストアに保存されません。
NSEntityDescription の簡易メソッドのおかげで新しい管理対象オブジェクトの作成と設定は容易になりますが、舞台裏で何が起きているのか詳しく知っていれば有益かもしれません。これが目下の関心事でなければ、このセクションをスキップしても支障はありません。しかし、このプロセスを十分に理解するために、いずれこの資料を読み返すことをお勧めします。
管理対象オブジェクトを Core Data インフラストラクチャに適切に統合するには、次の 2 つの要素が必要になります。
管理対象オブジェクトのコンテキスト
エンティティの記述
コンテキストは、管理対象オブジェクトと Core Data の他のインフラストラクチャとの間を取り持ちます。そのインフラストラクチャは、管理対象オブジェクトに対する変更を、コンテキストで維持されるアンドゥアクションと、管理対象オブジェクトに割り当てられている永続ストアで実行する必要がある操作に変換しなければなりません。
コンテキストはまた実質的に、Core Data の他のインフラストラクチャへの出入り口でもあります。したがって、コンテキストへの参照を維持するか、参照を簡単に取得する手段を持つことが期待されます。たとえば、NSPersistentDocument を使用するドキュメントベースアプリケーションを開発する場合は、ドキュメントクラスの managedObjectContext メソッドを使用することができます。
エンティティ記述は、(特に)エンティティの名前、エンティティを表すのに使用するクラス、およびエンティティのプロパティを指定します。クラスは複数のエンティティを表すのに使用されることもあるので、エンティティの記述は重要です。デフォルトでは、エンティティはすべて NSManagedObject で表されます。Core Data はエンティティ記述を使用して、オブジェクトにどのようなプロパティがあり、永続ストアに何を保存し、そこから何を取り出す必要があり、プロパティ値にどのような制約があるかを知ります。エンティティ記述は管理対象オブジェクトモデルのプロパティです。モデルの作成の詳細については、「Data Modeling for Core Data」および「Creating a Managed Object Model Using Xcode」を参照してください。
次の例に示すように、NSEntityDescription の簡易メソッド(entityForName:inManagedObjectContext:)を使用して、適切なエンティティ記述を取得できます(このメソッドの舞台裏で起きていることについては、NSEntityDescription のクラスドキュメンテーションで説明しています)。
|
管理対象オブジェクトモデルの中で管理対象オブジェクトのエンティティに対して指定したクラスを使用して、管理対象オブジェクトの新しいインスタンスを作成できます。新しい Employee オブジェクトを作成する必要があり、モデルの中で Employee エンティティをカスタムクラス(たとえば Employee)で表すように指定した場合は、Employee のインスタンスを割り当てて初期化します。Employee エンティティを NSManagedObject で表すように指定した場合は、NSManagedObject のインスタンスを割り当てて初期化します。
前述したように、新しい管理対象オブジェクトインスタンスを、その環境を定義する管理対象オブジェクトコンテキスト、およびそのプロパティを定義するエンティティオブジェクトに関連付ける必要があります。次の例に示すように、エンティティと管理対象オブジェクトコンテキストの設定はともに、NSManagedObject の指定イニシャライザ(initWithEntity:insertIntoManagedObjectContext:−管理対象オブジェクトには init メッセージを送ってはなりません)で処理します。
|
しかし、もう 1 つの問題として、エンティティがアプリケーションのライフサイクルのさまざまな時点で異なるクラスとして表される可能性があるという問題があります。最初は、すべてのエンティティを NSManagedObject で表すかもしれません。その後、カスタムクラスを作成するかもしれません。さらに、その名前を変更するかもしれません。そのため、クラス名をハードコードせずに、次の例に示すように、エンティティに指定されている任意のクラスを使用してインスタンスを作成するのが賢明です。
|
これは実質的には、NSEntityDescription の簡易メソッド(insertNewObjectForEntityForName:inManagedObjectContext:)が自動的に実行することです(もっとも、NSEntityDescription のメソッドは、自動解放オブジェクトを返します)。
管理対象オブジェクトの削除は簡単です。編集コンテキストに deleteObject: メッセージを送り、削除するオブジェクトを引数として渡すだけです。
|
これで、オブジェクトグラフから管理対象オブジェクトが取り除かれます。コンテキストを保存するまで新しいオブジェクトがストアに保存されないのと同様に、コンテキストを保存するまで、削除されたオブジェクトはストアから取り除かれません。
管理対象オブジェクトを削除するときは、その関係、特に関係に指定されている削除ルールを考慮することが重要です。管理対象オブジェクトの関係削除ルールがすべて Nullify(無効にする)の場合、少なくとも当該オブジェクトについてはほかの作業は必要ありません(関係のデスティネーションである他のオブジェクトを考慮する必要があるかもしれません。逆関係が必須であったり、濃度に下限がある場合は、デスティネーションオブジェクトが無効になる可能性があります)。関係削除ルールが Cascade(カスケード)の場合、1 つのオブジェクトを削除すると、他のオブジェクトを削除することになるかもしれません。ルールが Deny(拒否)の場合は、オブジェクトを削除する前に、関係からデスティネーションオブジェクトを取り除く必要があります。さもなければ保存時に検証エラーが発生します。削除ルールが No Action(アクションなし)の場合は、オブジェクトグラフの整合性確保に必要な処置を取る必要があります。詳細については、「関係削除ルール」を参照してください。
Preliminary Last updated: Tiger
|
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 |