アプリケーションで複数の永続ストアを作成していますが、1つの永続ストアコーディネーターと管理対象オブジェクトモデルのみを使用しています。ここで私の質問は、管理対象オブジェクトコンテキストでsaveメソッドを呼び出すときです。これは、オブジェクトの保存に使用する永続ストアです。そこで、オブジェクトの保存に使用する永続ストアを指定したいと思います。データベースからオブジェクトをフェッチするときも同じですが、フェッチクエリを特定のストアで実行して、そのストアからのみオブジェクトを取得できるようにする必要があります。何か助けはありますか?
3 に答える
構成を使用できます。
[PersistentStoreCoordinator addPersistentStoreWithType:configuration:URL:options:nil error:]
単一の管理対象オブジェクトコンテキスト、単一の管理対象オブジェクトモデル、単一の永続ストアコーディネーターが必要であるが、2つの永続ストアが必要だとします。たとえば、最初のストアはSQLiteストアで、2番目のストアはメモリ内ストアです。
このセットアップでは、SQLiteストア用の「SQLiteStore」とインメモリストア用の「InMemoryStore」の2つの構成を作成します。XCodeの場合(.xcdatamodelファイルを開きます):
管理対象オブジェクトモデルで使用可能な構成のリストが表示されます。管理対象オブジェクトモデルの構成は、基本的に、文字列名に関連付けられたエンティティの説明のセットです。構成を追加するには、.xcdatamodelファイルを開いた状態で[エディター]-> [構成の追加]メインメニュー項目を使用し、任意の文字列名を入力します。最初のSQLiteストアに保存するエンティティを「SQLiteStore」構成にドラッグし、その他のエンティティを「InMemoryStore」構成にドラッグします。
これで、コードを更新するときが来ました。スコープに移動し、永続ストアコーディネーターを作成して、永続ストアコーディネーターを追加します。唯一の変更は、それらの構成を指定することです。
...
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:yourManagedObjectModel];
NSURL storeURL = … // your store url
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"SQLiteStore" URL:storeURL options:nil error:&error])
{
NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
abort();
}
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSInMemoryStoreType configuration:@"InMemoryStore" URL:nil options:nil error:&error])
{
NSLog(@"[Core Data error] Unresolved error %@, %@", error, [error userInfo]);
abort();
}
...
これで、「InMemoryStore」構成にドラッグしたすべてのエンティティが自動的にメモリ内の永続ストアに保存され、「SQLiteStore」についても同じことが言えます。その後、デバイス/シミュレーターにアプリを再インストールする必要があるかもしれません。
そして、速い履歴書:
- 管理対象オブジェクトモデルエディター(.xcdatamodelファイル)で構成を作成します。
- コードで、永続ストアコーディネーターにいくつかの永続ストアを追加し、適切な構成名を指定します。
詳細については、次のリンクを確認してください: http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/CoreData/Articles/cdBasics.html#//apple_ref/doc/uid/TP40001650-SW4
フェッチは問題になりません。NSFetchRequestのsetAffectedStores:メソッドを使用して、特定のストアを検索するようにフェッチ要求を変更できます。
オブジェクトを作成するときに、NSManagedObjectContextのassignObject:toPersisentStore:メソッドを使用して、エンティティを特定のストアに割り当てることができます。
あなたの質問に関しては、私が知っているデフォルトのメカニズムは実際にはありません。影響を受けるストアをすべてのストアに設定する必要があるだけかもしれません。
[request setAffectedStores:[NSArray arrayWithObjects:firstStore,secondStore,thirdStore, nil]];
あなたがすべての適切な場所を探していることを確認するために。
本当に店舗ごとにPSCを使いたいと思います。これにより、あなたが説明する問題が解消され、PSCを1つだけにしたい理由がわかりません。