代码改变世界

使用CoreData的轻量级自动数据迁移

2013-05-13 15:34  三戒1993  阅读(102)  评论(0编辑  收藏  举报

使用IOS的CoreData进行存储很方便,CoreData已经帮我们做了很多基础的工作,一般情况下没必要自己操作数据库了。

在开发中修改了实体模型,可能会遇到schema incompatibility的错误,这是因为修改了数据结构,要进行数据迁移。

其实很多简单的情况,不用这么麻烦,Coredata提供了轻量级的自动数据迁移,比如以下三个情况会自动进行:

1.简单的增加一个字段

2.把一个必填字段改为可选字段

3.把可选字段改为必填字段(但一定要定义默认值)

 

怎样开启自动迁移的功能?分三步

1.在App delegate类里修改persistentStoreCoordinator方法

C代码  收藏代码
  1. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {  
  2.     if (__persistentStoreCoordinator != nil) {  
  3.         return __persistentStoreCoordinator;  
  4.     }  
  5.       
  6.     NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"WorkXP.sqlite"];  
  7.       
  8.     NSError *error = nil;  
  9.     __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];  
  10.       
  11.     // handle db upgrade  
  12.     NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:  
  13.                              [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,  
  14.                              [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];  
  15.       
  16.     if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {  
  17.        // Handle error  
  18.     }      
  19.       
  20.     return __persistentStoreCoordinator;  
  21. }  

 

2.增加一个新版本

选择上你的xcdatamodel文件 Design -> Data Model -> Add Model Version (expand your xcdatamodeld item) 选择 “2″ (或者最新的) 文件, Design -> Data Model -> Set Current Version (然后编辑这个版本的文件)

 

3.在App delegate中指定momd资源

C代码  收藏代码
  1. - (NSManagedObjectModel *)managedObjectModel {  
  2.     if (__managedObjectModel != nil) {  
  3.         return __managedObjectModel;  
  4.     }  
  5.     NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"WorkXP" withExtension:@"momd"];  
  6.     __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];  
  7.     return __managedObjectModel;  
  8. }