iOS持久化Core Data之二 托管对象模型的迁移

本文介绍如何在CoreData中进行模型版本的更新与数据迁移,包括轻量级迁移和默认迁移方式,并提供具体代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:按照《Core Data 应用开发》的思路整理记录

如果对模型进行了结构化的更改,则需要把旧模型上数据迁移到新的模型上,否则映射错误,程序会崩溃。


(一) 创建新的模型版本



(二) 轻量级的迁移方式

  将新模型设为当前版本后,协调器会尝试用新的模型打开原有的存储区,在向协调器添加存储区的时候,我们需要传递 option 来指导协调器。

在 CoreDataHelper 类中,loadStore 方法 中添加代码:

    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@"YES"
                              ,NSInferMappingModelAutomaticallyOption:@"YES"
                              };
 添加后 loadStore 方法如下:

//加载sqlite持久化文件
- (void)loadStore{
    if(debug == 1){
        NSLog(@"Running %@ '%@'", self.class,NSStringFromSelector(_cmd));
    }
    
    if(_store){return;}
    
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@"YES"
                              ,NSInferMappingModelAutomaticallyOption:@"YES"
                              };
    
    NSError *error = nil;
    _store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:options error:&error];
    
    if(!_store){
        NSLog(@"Failed to add store. Error: %@", error);
    }else{
        if(debug == 1){
            NSLog(@"Successfully added store: %@", _store);
        }
    }

}
其中 NSMigratePersistentStoresAutomaticallyOption 为 YES 的话,Core Data 会试着把低版本的持久化存储区迁移至新版本;

        NSInferMappingModelAutomaticallyOption 为 YES 的话,Core Data 会以最合理的方式,把旧模型的实体属性对应到新模型的实体属性上。


(三) 默认的迁移方式

  有时我们会需要精确的控制,比如实体名和属性名发生变化,需要手工创建模型映射。

假设原实体为 Measurement 属性为 abc,现实体为 Amount 属性为 xyz,我们的工作是在新旧模型上,建立两者的映射。

创建 Mode2toModel3


旧:Source

新:Target

还要将 NSInferMappingModelAutomaticallyOption 设置为 NO


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值