Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据-多个具有合并模型的持久存储区,创建所有存储区中所有实体的联合(尽管配置不同)_Ios_Core Data_Core Data Migration - Fatal编程技术网

Ios 核心数据-多个具有合并模型的持久存储区,创建所有存储区中所有实体的联合(尽管配置不同)

Ios 核心数据-多个具有合并模型的持久存储区,创建所有存储区中所有实体的联合(尽管配置不同),ios,core-data,core-data-migration,Ios,Core Data,Core Data Migration,我有一个应用程序,其中我有多个模块,每个模块都有自己的ManagedObjectModel,每个模型定义了一个配置,其中包括该模型中的所有实体,以便将数据保存到不同的NSPersistentStore(sqlite) 在应用程序启动期间,我使用以下方法组合所有这些模型。这样,我的应用程序只需处理一个NSManagedObjectContext,就可以访问应用程序中的所有实体,而不必担心实体将保存到哪个存储。应用程序创建一个NSPersistentStoreCoordinator,然后添加与这些不

我有一个应用程序,其中我有多个模块,每个模块都有自己的ManagedObjectModel,每个模型定义了一个配置,其中包括该模型中的所有实体,以便将数据保存到不同的NSPersistentStore(sqlite)

在应用程序启动期间,我使用以下方法组合所有这些模型。这样,我的应用程序只需处理一个NSManagedObjectContext,就可以访问应用程序中的所有实体,而不必担心实体将保存到哪个存储。应用程序创建一个NSPersistentStoreCoordinator,然后添加与这些不同型号关联的不同商店

我遵循Marcus Zarra的核心数据和插件中的插件范例,将其应用于iOS

我看到的问题是,当我查看由NSPersistentStores创建的各种sqlite文件时,每个存储都包含来自NSManagedObjectModels联合的每个实体

如何防止核心数据将所有实体的联合添加到每个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]];
然后,我们通过以下方式将此MergedOM设置为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];

一旦运行此操作并创建/保存所有类型的实体(A-D),实体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。

你为什么在意?SQLite后端是一个未记录的实现细节。您的应用程序中是否存在需要修复的问题?我很关心,因为在我的应用程序中,我会将应用程序中使用完整模型的部分模型创建的sqlite商店捆绑在一起。这些sqlite存储将是只读的,我不能让应用程序用它们不使用的表来修改它们,但是我在核心数据中得到一个错误,说数据需要迁移。@rvijay007你找到解决方案了吗?我也有同样的问题-每个.sqlite文件包含每个实体的列,而不仅仅是其配置中的实体。“我不知道怎么修它。”亨德利:不,我不知道。不幸的是,这是通过设计配置CoreData的方式。
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];