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

Posted

技术标签:

【中文标题】具有单个持久存储协调器的多个数据模型【英文标题】:Multiple data models with single persistent store coordinator 【发布时间】:2015-11-03 16:36:41 【问题描述】:

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

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

【问题讨论】:

请张贴正在使用的实际代码。也许您所做的只是将某些内容注释掉,但是当您发布的内容显然不是实际运行的内容时,很难知道实际代码是什么。另外,“我看到的是加密核心数据 (ECD) 仅在第一次创建的持久存储中创建表”是什么意思?另外,请明确说明您对这个问题的目标,因为那里似乎有很多问题。 【参考方案1】:

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

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

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

【讨论】:

我会尝试在运行时合并数据模型,看起来这可以解决问题(希望如此)。谢谢! 好消息,将模型合并到单个 NSManagedObjectModel 确实有效 :-) 至少 ECD 现在正在为所有实体创建表。再次感谢!

以上是关于具有单个持久存储协调器的多个数据模型的主要内容,如果未能解决你的问题,请参考以下文章

使用具有单个 sqlalchemy 模型的多个数据库

无需迁移即可替换核心数据模型

核心数据:具有多个上下文的独立持久存储与具有单个上下文的独立持久存储

核心数据:无法将持久存储添加到协调器

CoreData 多个持久存储协调器?

具有核心数据的多个持久性存储