4

それぞれが独自の ManagedObjectModel を持つ複数のモジュールを持つアプリケーションがあり、各モデルはそのモデル内のすべてのエンティティを含む構成を定義して、データが別の NSPersistentStore (sqlite) に保存されるようにします。

アプリケーションの起動時に、次の方法を使用してこれらすべてのモデルを結合します。これは、私のアプリケーションが 1 つの NSManagedObjectContext だけを処理し、アプリ内のすべてのエンティティにアクセスできるようにするためです。エンティティが保存されるストアについて心配する必要はありません。アプリは 1 つの NSPersistentStoreCoordinator を作成し、これらのさまざまなモデルに関連付けられたさまざまなストアを追加します。

Marcus Zarra の Core Data and Plugins ( http://www.cimgf.com/2009/05/03/core-data-and-plug-ins/ ) のプラグイン パラダイムに従い、 iOS に適合させました。

私が見ている問題は、NSPersistentStores によって作成されたさまざまな sqlite ファイルを調べると、すべてのストアに NSManagedObjectModels の結合からのすべてのエンティティが含まれていることです。

Core Data がすべてのエンティティのユニオンをすべての sqlite ストアに追加しないようにするにはどうすればよいですか?

補遺: (私がやろうとしていることの疑似コード)

以下があるとしましょう:

このプロジェクトでは、MOM1.xcdatamodeld と MOM2.xcdatamodeld の 2 つの ManagedObject モデルが定義されています。

MOM1 defines EntityA and EntityB. It defines "MOM1_Configuration" = Entities A,B.

MOM2 defines EntityC and EntityD. It defines "MOM2_Configuration" = Entities C,D.

コードでは、配列 @[MOM1,MOM2] を作成し、modelByMergingModels を使用して結合します。

MergedMOM = [NSManagedObjectModel modelByMergingModels@[MOM1, MOM2]];

次に、この mergedMOM を次の方法で NSPersistentStoreCoordinator に設定します。

[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:MergedMOM];

最後に、次の方法でストアを追加します。

NSURL* storeURL = [[[NSFileManager defaultManager] applicationDocumentsDirectory] URLByAppendingPathComponent:@"MOM1.sqlite"];
NSDictionary* migrationOptions = @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
                                       NSInferMappingModelAutomaticallyOption : @(YES)};
NSError* error;

NSPersistentStore* store = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                        configuration:@"MOM1_Configuration"
                                                                                  URL:storeURL
                                                                              options:migrationOptions
                                                                                error:&error];

NSURL* storeURL = [[[NSFileManager defaultManager] applicationDocumentsDirectory] URLByAppendingPathComponent:@"MOM2.sqlite"];
NSDictionary* migrationOptions = @{NSMigratePersistentStoresAutomaticallyOption : @(YES),
                                       NSInferMappingModelAutomaticallyOption : @(YES)};
NSError* error;

NSPersistentStore* store = [persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                        configuration:@"MOM2_Configuration"
                                                                                  URL:storeURL
                                                                              options:migrationOptions
                                                                                error:&error];

これが実行され、すべてのタイプ (AD) のエンティティが作成/保存されると、エンティティ A、B は MOM1.sqlite に正しく保存され、エンティティ C、D は MOM2.sqlite に正しく保存されます。

ただし、MOM1.sqlite にはエンティティ C、D の空のテーブルがあり、MOM2.sqlite にはエンティティ A、B の空のテーブルがあります。

MOM1.sqlite が C、D のテーブルを定義せず、MOM2.sqlite が A、B のテーブルを定義しないように設定するにはどうすればよいですか。アプリの ManagedObjectContext 。

4

0 に答える 0