我继承了一个使用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只处理添加到单个协调器的持久存储。基于这个假设,我想知道是否有可能创建一个协调器并向其添加几个商店。
我对核心数据并不熟悉,但由于协调器使用托管对象模型进行初始化(指向仅包含一组总数的特定数据模型文件),因此无法看到这是怎么回事。项目中的实体)。
有什么想法吗?我真的想避免将所有数据模型合并为一个,以便使用单个托管对象模型和协调器(实际上我想这样做但我相信它会破坏 一切,我现在不需要时间了。)
答案 0 :(得分:2)
在不合并模型的情况下,您无法使用单个持久性存储协调器。但是,您不必编辑数据模型 - 您可以在运行时合并它们。 NSManagedObjectModel
提供了几种将多个模型合并为一个统一模型的不同方法。如果您单独加载每个模型并将它们合并到代码中,则会得到一个NSManagedObjectModel
表示每个模型文件中的组合模型。然后,您可以将该组合模型与单个持久性存储协调器一起使用。
如果您仍在使用多个模型文件,则可以单独添加每个模型文件。这会引起复杂化 - 在创建新的模型对象实例时,Core Data将如何知道要使用哪个模型文件?您必须使用assignObject:toPersistentStore:
上的NSManagedObjectContext
方法告诉它使用哪一种方法。每次创建新实例时,也会执行此操作。这意味着您需要保留对每个文件的NSPersistentStore
实例的引用,并知道在每种情况下使用哪些实例。
我应该补充一点,我没有使用加密的核心数据,因此我不知道这是否能解决您的真正问题。但是,这种方法将允许多个模型文件和多个持久存储与一个协调器。