我有一个应用程序,其中有多个模块,每个模块都有自己的 ManagedObjectModel,每个模型都定义了一个配置,其中包含该模型中的所有实体,以便将数据保存到不同的 NSPersistentStore (sqlite)。
在应用程序启动期间,我使用以下方法组合所有这些模型。这样我的应用程序可以只处理一个 NSManagedObjectContext 并可以访问应用程序中的所有实体,而不必担心实体将保存到哪个存储。该应用程序创建一个 NSPersistentStoreCoordinator,然后添加与这些不同模型关联的不同商店。
我在这里遵循了 Marcus Zarra 的核心数据和插件中的插件范例:http ://www.cimgf.com/2009/05/03/core-data-and-plug-ins/ ,使其适应 iOS。
我看到的问题是,当我查看由 NSPersistentStores 创建的各种 sqlite 文件时,每个商店都包含来自 NSManagedObjectModels 联合的每个实体。
如何防止 Core Data 将所有实体的 Union 添加到每个 sqlite 存储中?
附录:(我正在尝试做的伪代码)
假设我们有以下内容:
在我们的项目中定义了两个 ManagedObject 模型,MOM1.xcdatamodeld 和 MOM2.xcdatamodeld。
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]];
然后我们通过以下方式将这个合并的MOM 设置为 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 定义任何表,但我可以使用 1 个 NSPersistentStoreCoordinator、MOM 和一个我的应用程序中的 ManagedObjectContext。