CoreData版本升级数据迁移

CoreData数据库结构升级和数据迁移

app中使用了CoreData,并且在下一个版本中有实体变动,比如实体新增字段、修改字段等改动,那么app在覆盖安装时就要进行数据库迁移,否则app就会crash

数据库迁移步骤

1.选中.xcdatamodeld文件,然后点击Xcode菜单editor->Add Model Version  比如取名:Model.xcdatamodel

2.取一个Version名字,Based on model是基于现有Model文件,一般是基于上一个版本Model,如果基于早与2个版本数据可能会丢失.

3.这时Model会多出一个版本xcdatamodel

4.设置当前数据库版本,选择刚才创建的版本,在inspector中的Versioned Core Data Model选择Current模版为Model3,基于当前最新版本xcdatamodel.

5.在最新最新Model3.xcdatamodel上新增修改表表/字段/关系等,当前最新版本为Model3

6.重新生成实体类,选中Model3.xcdatamodel

然后下一步,选中需要重新生成的实体model.重新生成就OK,无需先把现有实体类删除再生成.

7.修改持久调度器中设置选项

//1、创建模型对象
    //获取模型路径
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    //根据模型文件创建模型对象
    NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    
    //2、创建持久化助理
    //利用模型对象创建助理对象
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    
    //数据库的名称和路径
    NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *sqlPath = [docStr stringByAppendingPathComponent:@"mySqlite.sqlite"];
    NSLog(@"path = %@", sqlPath);
    NSURL *sqlUrl = [NSURL fileURLWithPath:sqlPath];
    
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@(YES),NSInferMappingModelAutomaticallyOption:@(YES)};
    //设置数据库相关信息
    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:options error:nil];
    
    //3、创建上下文
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
    
    //关联持久化助理
    [context setPersistentStoreCoordinator:store];
    
    _context = context;

关键代码为:

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@(YES),NSInferMappingModelAutomaticallyOption:@(YES)};
    //设置数据库相关信息
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlUrl options:options error:nil];

重新运行编译运行项目就正常可以运行.通过查看数据库文件表和字段已经加上,员工表已经机上rDate字段.

以上就iOS app CoreData数据库升级数据迁移步骤. App升级覆盖安装数据就迁移了,也不会出现因修改了表而导致app Crash. App卸载安装数据库使用设置的当前最新版本xcdatamodel数据结构.

原文地址:https://www.cnblogs.com/HJiang/p/7819124.html