0

我继承了一个使用 Core Data 的 iOS 项目。这个项目有8 种不同的数据模型,不用说项目不大,我看不出有什么好的理由将实体拆分为这么多数据模型。

我正在尝试将加密核心数据与当前数据模型和持久存储协调器一起使用,但它根本不起作用。每个数据模型都是这样初始化的:

    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 不是很熟悉,但我看不出这怎么可能,因为协调器是用托管对象模型初始化的(它指向一个特定的数据模型文件,其中只包含一组实体的总数)项目)。

有任何想法吗?我真的很想避免将所有数据模型合并到一个单独的模型中,以便使用单个托管对象模型和协调器(实际上我想这样做,但我相信它会破坏一切,我真的不必现在是时候了)。

4

1 回答 1

3

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

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

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

于 2015-11-03T18:34:25.110 回答