coredata 通过检测版本自定义迁移

Posted

技术标签:

【中文标题】coredata 通过检测版本自定义迁移【英文标题】:coredata custom migration by detecting version 【发布时间】:2013-09-30 03:18:16 【问题描述】:

我正在尝试进行自定义核心数据迁移。

在旧数据模型中,我有一个带有状态字段的联系人表。 现在,如果状态 == 2,我希望为联系人表中的每条记录创建另一个表 -“推荐”。推荐表中的属性与联系人表中的属性完全不同。

有什么好方法可以做到这一点。

从我读到的,看来我应该使用自定义 coredata 迁移策略并覆盖

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject*)src ¬
entityMapping:(NSEntityMapping*)map manager:(NSMigrationManager*)mgr error:(NSError**)error 

但是实现我想做的事情似乎太复杂了。目前我的数据模型版本为 15。我是否需要为从 1 到 14 的所有先前模型版本创建映射模型?如果我下次有版本 20 并且用户直接从版本 10 更新到版本 20,是否也会触发此迁移策略?如果出现任何问题,很难测试会发生什么。

我尝试了另一种方法 - 当我初始化 storecoordinator 时,我使用:

    NSManagedObjectModel *destinationModel = [self managedObjectModel];
    // Migration is needed if destinationModel is NOT compatible
    BOOL isMigrationNeeded = ![destinationModel isConfiguration:nil
                                    compatibleWithStoreMetadata:sourceMetadata];

    if (isMigrationNeeded) 

        self.needMigration = YES;
        DDLogInfo(@"Migration needed");

        NSArray* sourceVersionIdentifiers = [sourceMetadata objectForKey:NSStoreModelVersionIdentifiersKey];
        self.sourceMigrationVersion = [sourceVersionIdentifiers lastObject];
        DDLogInfo(@"Source Version:%@",self.sourceMigrationVersion);

        NSSet* destVersionIdentifiers = [destinationModel versionIdentifiers];
        self.destMigrationVersion = [destVersionIdentifiers anyObject];
        DDLogInfo(@"Destination Version:%@",self.destMigrationVersion);
    

- (NSDictionary *)sourceMetadata:(NSError **)error

    return [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
                                                                      URL:[self storeURL]
                                                                    error:error];

基本上,如果我检测到它正在迁移到某个版本,我会尝试比较旧模型和新模型的数据模型版本并在其他地方运行一些自定义代码。

问题是我的一些旧数据模型版本没有版本标识符。即使我现在添加它们,它也不会显示在源元数据中。我猜你必须在从模型创建商店时明确设置它?

另一种选择是忽略上述所有内容,并在执行迁移时设置并保存一个标志,并在每次启动时检查该标志。但这对我来说听起来不是很干净。

有什么想法吗?

【问题讨论】:

【参考方案1】:

您也可以使用简单的NSUserDefault。它也不会出现在旧版本中。这是一个完全可以接受的机制,并且无论如何都不是“不干净的”。

是的,您需要从第一个版本开始的所有数据模型版本,是的,从 10 到 20 的迁移将是自动的,前提是您在持久存储中启用了自动迁移。

【讨论】:

以上是关于coredata 通过检测版本自定义迁移的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 轻量级迁移后执行自定义代码

将“检测外部点击”自定义指令从 Vue 2 迁移到 Vue 3

CoreData 类的自定义方法

通过UserNotification自定义操作访问时,CoreData无法初始化托管对象

CoreData 的自定义 UID 数据类型

Magical Record 自定义核心数据迁移不提取现有数据