具有单个持久存储协调器的多个数据模型
Multiple data models with single persistent store coordinator
我继承了一个使用 Core Data 的 iOS 项目。这个项目有8个不同的数据模型,不用说这个项目不是那么大,我看不出有什么好的理由将实体拆分到这么多数据模型上。
我正在尝试将 Encrypted Core Data 与当前的数据模型和持久存储协调器一起使用,但它根本不起作用。每个数据模型都是这样初始化的:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"First"
withExtension:@"momd"];
self.model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// Coordinator
//NSPersistentStoreCoordinator *psc = [EncryptedStore makeStore: self.model passcode: @"pass"];
[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];
NSURL *storeURL = [[[AppDelegate appDelegate] applicationDocumentsDirectory] URLByAppendingPathComponent: @"First.sqlite"];
NSError *error = nil;
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error];
NSManagedObjectContextConcurrencyType ccType = NSMainQueueConcurrencyType;
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:ccType];
[self.context setPersistentStoreCoordinator:psc];
所以每个数据模型都有自己的托管对象模型和自己的持久存储协调器及其持久存储和上下文。
我看到的是加密核心数据 (ECD) 仅在第一个创建的持久存储中创建表。我怀疑 ECD 只处理添加到单个协调器的持久存储。基于这个假设,我想知道是否可以创建一个协调器并向其添加多个商店。
我不太熟悉核心数据,但我看不出这是怎么可能的,因为协调器是用托管对象模型初始化的(它指向一个特定的数据模型文件,只包含一组总项目中的实体数量)。
有什么想法吗?我真的很想避免将所有数据模型合并为一个,以便使用单个托管对象模型和协调器(实际上我想这样做,但我确信它会中断
一切,我现在真的没有时间。
您不能在不合并模型的情况下使用单个持久存储协调器。但是,您不必编辑数据模型——您可以在 运行 时合并它们。 NSManagedObjectModel
提供了几种不同的方法来将多个模型合并为一个统一的模型。如果您独立加载每个模型并将它们合并到代码中,您会得到一个 NSManagedObjectModel
表示来自每个模型文件的组合模型。然后,您可以将该组合模型与单个持久性存储协调器一起使用。
如果您仍在使用多个模型文件,您可以分别添加每一个。但这会带来一个复杂的问题——当您创建一个新的模型对象实例时,Core Data 如何知道要使用哪个模型文件?您必须在 NSManagedObjectContext
上使用 assignObject:toPersistentStore:
方法来告诉它使用哪一个。每次创建新实例时,您也会这样做。这意味着您需要为每个文件保留对 NSPersistentStore
实例的引用,并知道在每种情况下使用哪个实例。
我应该补充一点,我没有使用过加密的核心数据,所以我不知道这是否能解决您的实际问题。不过,这种方法将允许多个模型文件和多个持久存储与单个协调器。
我继承了一个使用 Core Data 的 iOS 项目。这个项目有8个不同的数据模型,不用说这个项目不是那么大,我看不出有什么好的理由将实体拆分到这么多数据模型上。
我正在尝试将 Encrypted Core Data 与当前的数据模型和持久存储协调器一起使用,但它根本不起作用。每个数据模型都是这样初始化的:
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"First"
withExtension:@"momd"];
self.model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
// Coordinator
//NSPersistentStoreCoordinator *psc = [EncryptedStore makeStore: self.model passcode: @"pass"];
[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];
NSURL *storeURL = [[[AppDelegate appDelegate] applicationDocumentsDirectory] URLByAppendingPathComponent: @"First.sqlite"];
NSError *error = nil;
[psc addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:storeURL
options:nil
error:&error];
NSManagedObjectContextConcurrencyType ccType = NSMainQueueConcurrencyType;
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:ccType];
[self.context setPersistentStoreCoordinator:psc];
所以每个数据模型都有自己的托管对象模型和自己的持久存储协调器及其持久存储和上下文。
我看到的是加密核心数据 (ECD) 仅在第一个创建的持久存储中创建表。我怀疑 ECD 只处理添加到单个协调器的持久存储。基于这个假设,我想知道是否可以创建一个协调器并向其添加多个商店。
我不太熟悉核心数据,但我看不出这是怎么可能的,因为协调器是用托管对象模型初始化的(它指向一个特定的数据模型文件,只包含一组总项目中的实体数量)。
有什么想法吗?我真的很想避免将所有数据模型合并为一个,以便使用单个托管对象模型和协调器(实际上我想这样做,但我确信它会中断 一切,我现在真的没有时间。
您不能在不合并模型的情况下使用单个持久存储协调器。但是,您不必编辑数据模型——您可以在 运行 时合并它们。 NSManagedObjectModel
提供了几种不同的方法来将多个模型合并为一个统一的模型。如果您独立加载每个模型并将它们合并到代码中,您会得到一个 NSManagedObjectModel
表示来自每个模型文件的组合模型。然后,您可以将该组合模型与单个持久性存储协调器一起使用。
如果您仍在使用多个模型文件,您可以分别添加每一个。但这会带来一个复杂的问题——当您创建一个新的模型对象实例时,Core Data 如何知道要使用哪个模型文件?您必须在 NSManagedObjectContext
上使用 assignObject:toPersistentStore:
方法来告诉它使用哪一个。每次创建新实例时,您也会这样做。这意味着您需要为每个文件保留对 NSPersistentStore
实例的引用,并知道在每种情况下使用哪个实例。
我应该补充一点,我没有使用过加密的核心数据,所以我不知道这是否能解决您的实际问题。不过,这种方法将允许多个模型文件和多个持久存储与单个协调器。