您的位置:首页 > 其它

coredata lightweight migration 轻量级自动迁移

2014-04-29 20:56 344 查看
转自:http://blog.csdn.net/sirchenhua/article/details/7302729 

coredata与tableview配合十分默契,而开发初期经常需要变动coredata的数据模型结构,不同的模型必须要进行迁移,否则App就crash了。

迁移就是要在老版本和新版本的数据库模型之间建立映射(mapping),这是当数据库模型变动较“大”时必须使用的方法,而当变动较小时,Coredata能够自动推导模型变化而进行迁移,这是所谓轻量级迁移lightweight migration。

何谓变化“小”

1.增加属性

2.删除属性

3.非可选属性变成可选属性

4.可选属性变成非可选属性,且指定一个默认值

5.重命名实体或属性

6.增加关系及改变关系的类型

增加或删除关系,重命名关系,改变关系类型(一对一,一对多,。。。)

7. 改变实体层级(hierarchy)

      增加、删除和重命名实体,创建实体的父、子实体或在实体继承结构中上下移动,将实体移出继承结构

其实可以允许的变化一点也不小吧,:)

好了,看下轻量级迁移的步骤:

1. 在得到persistentstore时,一般是在appdeleate的persistentStoreCoordinator方法中,为addPersistentStoreWithType:configuration:URL:options:error:方法的options传递参数,模板产生的方法该参数是nil。

为支持自动迁移,传递一个包含2个key的字典作为参数,NSMigratePersistentStoresAutomaticallyOptionNSInferMappingModelAutomaticallyOption,赋值YES。

其实用模板生成的启动Coredata工程仔细看的话该函数下面有段注释

[java] view
plaincopyprint?

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"xxx.sqlite"];  

  

NSError *error = nil;  

NSDictionary * opt = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];  

__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];  

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:opt error:&error])  

2. 创建新版本并选择当前active模型版本,

xcode 4里,创建新模型是在Editor里的Add Model Verison,

要选择当前使用的数据模型版本,在文件导航中,先选中appname.xcdatamodeld这个,然后在右侧属性栏中Versiond Core Data Model中选择Current的模型版本。





3.OK了,再次运行,App可以访问新版本的coredata数据库模型了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: