美文网首页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