ios - 具有单个持久存储协调器的多个数据模型

标签 ios core-data sqlcipher encrypted-core-data-sql

我继承了一个使用 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 只处理添加到单个协调器的持久存储。基于这个假设,我想知道是否可以创建一个协调器并向其添加多个商店。

我对 Core Data 不太熟悉,但我看不出这是怎么可能的,因为协调器是用托管对象模型初始化的(它指向一个特定的数据模型文件,只包含一组项目中的实体)。

有什么想法吗?我真的很想避免将所有数据模型合并为一个,以便使用单个托管对象模型和协调器(实际上我想这样做,但我确信它会中断 一切,我现在真的没有时间去做)。

最佳答案

您不能在不合并模型的情况下使用单个持久性存储协调器。但是,您不必编辑数据模型——您可以在运行时合并它们。 NSManagedObjectModel 提供了几种不同的方法来将多个模型合并为一个统一的模型。如果您独立加载每个模型并将它们合并到代码中,您将获得一个 NSManagedObjectModel 表示来自每个模型文件的组合模型。然后,您可以将该组合模型与单个持久性存储协调器结合使用。

如果您仍在使用多个模型文件,您可以分别添加每一个。但这会带来一个复杂的问题——当您创建一个新的模型对象实例时,Core Data 如何知道要使用哪个模型文件?您必须在 NSManagedObjectContext 上使用 assignObject:toPersistentStore: 方法来告诉它使用哪一个。每次创建新实例时,您也会这样做。这意味着您需要为每个文件保留对 NSPersistentStore 实例的引用,并知道在每种情况下使用哪个实例。

我应该补充一点,我没有使用过加密的核心数据,所以我不知道这是否能解决您的实际问题。不过,这种方法将允许多个模型文件和多个持久存储与单个协调器。

关于ios - 具有单个持久存储协调器的多个数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33504450/

相关文章:

ios - 在 iOS 上禁用调试 session - 这有用吗?

ios - 分解 iOS 应用程序中不同存储方法的用例

cocoa - 使用 setValue :forKey: against it's CoreData bound field 时 NSPopupButton 不更新

ios - iOS中使用SqlCipher存储数据时可以使用CoreData来管理离线数据吗

ios - 如何在默认 xcode 应用程序中使用 sqlite cipher?

ios - sqlcipher 在 iOS 10 中停止工作

ios - 从 iOS 9 开始,我无法再获取无线 SSID : CNCopyCurrentNetworkInfo won't work

ios - 找不到 -lxml2 的库

ios - Stripe API 给出 ​​ 'SenTestingKit/SenTestingKit.h' 找不到文件

ios - 将 ABRecordID 转换为 NSNumber 总是 -1