美文网首页iOS技术专题iOS收集iOS数据库
iOS CoreData版本升级和数据库迁移

iOS CoreData版本升级和数据库迁移

作者: ParadiseKiss | 来源:发表于2016-04-22 17:39 被阅读4330次
 app中使用了CoreData,并且在下一个版本中有实体变动,比如实体新增字段、修改字段等改动,
那么app在覆盖安装时就要进行数据库迁移,
否则app就会crash。

那如何实现数据库迁移呢?大概需要这几个步骤:

1. 选中你的CoreData.xcdatamodeld文件,选择Xcode菜单editor->Add Model Version  
比如取名:mydata2.xcdatamodel
截图.png 截图.png
2. 起一个名字,也就是当前新版本CoreData文件的名字。然后点击确认。
新的CoreData名字
3. 这时候会发现CoreData.xcdatamodeld中多了一个版本文件。如图:
96780DBF-2880-429C-ABE4-405A844D9ABB.png
4.选择刚才创建的版本,在inspector中的Versioned Core Data Model选择Current模版为CoreData2
截图
5.  修改新数据模型CoreData2,在新的文件上添加属性和修改实体。
6. 删除原来的实体文件,重新生成下的类。
删除实体类文件,重新生成新的类文件
7. 在persistentStoreCoordinator中添加代码:
添加代码
8. 重新编译运行就OK了。

PS: Xcode8 系统CoreData类做了不少改动,当然使用起来更简单了,如果您是用Xcode8创建的工程实现版本升级和数据迁移,则直接修改实体,然后重新生成即可,非常简单。具体使用和代码见https://github.com/qindeli/XCode8-CoreData-/tree/master/TestCoreData.

相关文章

网友评论

  • 张囧瑞:您好,请问Xcode8以后的升级是直接新增xcdatamodel就可以了嘛??我这边升级了之后再运行,之前的数据就没有了。
    张囧瑞:@ParadiseKiss 我找到问题了,应该是我最开始创建model的时候方式不对,谢谢你回复我
    ParadiseKiss:@张囧瑞 直接新增就可以了,你是怎么升级的
  • 陈大好Davis:有swift版本吗
  • Adeno:请问一下...xcode8,一开始构建工程时没有勾选coreData,但AppDelegate上有补上代码,然后根据你这个方法...新增一个版本V2,V2实体内容新增一个字段,不会crash,但是数据没有迁移过去...切换回V1,数据是还在的...这个是什么问题
    Adeno:@ParadiseKiss

    .m文件

    - (void)applicationWillTerminate:(UIApplication *)application {
    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    // Saves changes in the application's managed object context before the application terminates.
    [self saveContext];
    }


    #pragma mark - Core Data stack

    @synthesize persistentContainer = _persistentContainer;

    - (NSPersistentContainer *)persistentContainer {
    // The persistent container for the application. This implementation creates and returns a container, having loaded the store for the application to it.
    @synchronized (self) {
    if (_persistentContainer == nil) {
    _persistentContainer = [[NSPersistentContainer alloc] initWithName:@"MessageModel"];
    [_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
    if (error != nil) {

    NSLog(@"Unresolved error %@, %@", error, error.userInfo);
    abort();
    }
    }];
    }
    }

    return _persistentContainer;
    }

    #pragma mark - Core Data Saving support

    - (void)saveContext {
    NSManagedObjectContext *context = self.persistentContainer.viewContext;
    NSError *error = nil;
    if ([context hasChanges] && ![context save:&error]) {
    // Replace this implementation with code to handle the error appropriately.
    // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
    NSLog(@"Unresolved error %@, %@", error, error.userInfo);
    abort();
    }
    }
    Adeno:@ParadiseKiss .h文件

    #import <UIKit/UIKit.h>
    #import <CoreData/CoreData.h>

    @interface AppDelegate : UIResponder <UIApplicationDelegate>

    @property (strong, nonatomic) UIWindow *window;

    @property (readonly, strong) NSPersistentContainer *persistentContainer;

    - (void)saveContext;


    @EnD

    ParadiseKiss:@Adeno 你代码怎么写的?
  • 杏仁丶:多谢:+1:
  • 神龍大俠:赶紧研究下 xcode8吧 你上面的代码在新版本里都没有了
    ParadiseKiss:@WLAnswer 是的
    WLAnswer:Xcode8添加删除字段都不用这些迁移了,只需要重新生成累文件就行了?
    ParadiseKiss:xcode8不需要做这些了,系统默认已经实现了。
  • 生活中的那些小事:我找这个步骤怎么 不好使 _3_CoreData___.sqlite 又是怎么回事
    ParadiseKiss:不用删除数据库,可能上面步骤你拉下了,一定要先创建一个版本,然后改创建版本的结构,而不能修改原来版本的结构。
    生活中的那些小事:@ParadiseKiss 我照上述方法 改了一遍 但是没有成功 是不是每次都得删除原先的数据库
    ParadiseKiss:那个是coredata创建的数据库,不用改它。
  • CoffeeKid:图文并茂,很详细
  • 蓝色沙漏:nice,不过要是能把FMDB的数据库版本迁移写出来就完美了。

本文标题:iOS CoreData版本升级和数据库迁移

本文链接:https://www.haomeiwen.com/subject/uvjxrttx.html