coredata lightweight migration 轻量级自动迁移

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的字典作为参数,NSMigratePersistentStoresAutomaticallyOption和NSInferMappingModelAutomaticallyOption,赋值YES。

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

    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数据库模型了。


如果遇到错误,可以是无法轻量级迁移,也可能是模型文件找不到,请参考文档去找答案吧


你可能感兴趣的:(数据库,xcode,url,Crash,hierarchy,migration)