データモデルのロード場合によっては、モデルをロードするためにコードを記述する必要はありません。OS Xでドキュメントベースのアプリケーションを使用する場合、NSPersistentDocumentは、アプリケーションのモデルを検索してロードするタスクを管理します。Xcodeを使用してCoreData(OS XまたはiOSの場合)を使用する非ドキュメントアプリケーションを作成する場合、アプリケーションデリゲートにはモデルを取得するためのコードが含まれます。モデルの名前(ディスクにモデルを保存するために使用されるファイル名で表される)は、実行時には関係ありません。モデルがCoreDataによって読み込まれると、ファイル名は無意味になり、意味がなくなるため、モデルファイルに任意の名前を付けることができます。
モデルを自分でロードする場合は、次の2つのメカニズムを使用できます。
インスタンスメソッドinitWithContentsOfURL:を使用して、特定のURLから単一のモデルをロードできます。これは一般的に好まれる手法です。通常、アプリケーションには単一のモデルがあり、この方法を使用すると、そのモデルのみをロードするようになります。また、URLを介して個々のモデルをロードし、modelByMergingModels:を使用してそれらを統合してから、コーディネーターをインスタンス化することもできます。
複数のモデルがある場合、特にモデルが同じスキーマの異なるバージョンを表す場合は、ロードするモデルを知ることが不可欠です(実行時に同じエンティティを持つモデルを1つのコレクションにマージすると、名前の衝突が発生します)およびエラー)。このメソッドは、アプリケーションのバンドルの外部にモデルを保存する必要がある場合にも役立ちます。そのため、ファイルシステムのURLを介してモデルを参照する必要があります。
クラスメソッドmergedModelFromBundles:を使用して、バンドルの特定のコレクションからマージされたモデルを作成できます。この方法は、モデルの分離が重要でない場合に役立つことがあります。たとえば、アプリケーションと、アプリケーションとそれがリンクするフレームワークの両方に、必要なモデルまたはロードしたいモデルがあることがわかっている場合があります。classメソッドを使用すると、名前を考慮せずにすべてのモデルを一度に簡単にロードしたり、すべてのモデルが確実に見つかるように専用の初期化コードを挿入したりできます。
実行時の管理対象オブジェクトモデルへのアクセスと使用
NSManagedObjectModel *model = <#Get a model#>;
NSFetchRequest *requestTemplate = [[NSFetchRequest alloc] init];
NSEntityDescription *publicationEntity =
[[model entitiesByName] objectForKey:@"Publication"];
[requestTemplate setEntity:publicationEntity];
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:
@"(mainAuthor.firstName like[cd] $FIRST_NAME) AND \
(mainAuthor.lastName like[cd] $LAST_NAME) AND \
(publicationDate > $DATE)"];
[requestTemplate setPredicate:predicateTemplate];
[model setFetchRequestTemplate:requestTemplate
forName:@"PublicationsForAuthorSinceDate"];
フェッチリクエストテンプレートの使用
NSManagedObjectModel *model = <#Get a model#>;
NSError *error = nil;
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"Fiona", @"FIRST_NAME", @"Verde", @"LAST_NAME",
[NSDate dateWithTimeIntervalSinceNow:-31356000], @"DATE", nil];
NSFetchRequest *fetchRequest =
[model fetchRequestFromTemplateWithName:@"PublicationsForAuthorSinceDate"
substitutionVariables:substitutionDictionary];
NSArray *results =
[aManagedObjectContext executeFetchRequest:fetchRequest error:&error];