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数据结构.