美文网首页
数据库的版本升级

数据库的版本升级

作者: LeeDev | 来源:发表于2017-03-17 10:46 被阅读23次

    原文链接

    有四个步骤 (有个问题 就是 假设老版本是 v1,当前更新的版本是 v3,这个时候 还需要从 v1=》v2=》v3? 我觉得是不需要的,我觉的可以 直接 从 v1=》v3 这个版本,但是每个版本的字段我们是需要记录下来的 这样 就根据 不同的老版本 的数据 迁移到 最新版本中就可以了 ,下面写的例子 是参考的

    • 把原来结构的T 改名 TempT
    • 创建新版本数据结构的 表 T
    • 将 TempT 中的 数据 =》T中
    • 删除TempT 表

    首先需要一个版本枚举

    typedef NS_ENUM(NSInteger, DBVersion) {
        DBVersionV1,
        DBVersionV2,    //历史版本
        DBVersionV3,    //当前版本
    };
    
    static NSString *const DBVersionNum  = @"DBVersionNum";
    static NSString *const dbPath = @"\tmp\tmp.db";     //数据库地址
    
    static NSString *const createTable = @"create table if not exists  t1("
    "id  integer PRIMARY KEY AUTOINCREMENT NOT NULL,"
    "name char(50),"
    "sex char(4),"
    "recordDate  TIMESTAMP default (datetime('now', 'localtime')))";
    
    - (instancetype)init{
        if (self = [super init]) {
            _queue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
        }
        return self;
    }
    采用FMDatabaseQueue 进行数据库操作的管理。
    
    
    /*
     *  需要初始化表结构时,调用此方法
     */
    - (void)newDBVersionInit{
        if (![[NSUserDefaults standardUserDefaults] objectForKey:DBVersionNum]) {
            //系统之前没有数据库 新建立表。
            [self createTables];
        }else{
            DBVersion ver = [[[NSUserDefaults standardUserDefaults] objectForKey:DBVersionNum] integerValue];
            switch (ver) {
                case DBVersionV1:{
                    [self v1ToV2];
                }
                case DBVersionV2:{
                    [self v2Tov3];
                }
                case DBVersionV3:{
    
                }
                    break;
                default:
                    break;
            }
        }
    }
    
    /*
     *  创建新表
     */
    - (void)createTables{
        [_queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            @try {
                [db executeUpdate:createTable];
            }
            @catch (NSException *exception) {
                *rollback = YES;
            }
        }];
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:DBVersionV3] forKey:DBVersionNum];
    }
    把 DBVersionNum的值写为V3版本 方便下次对比。
    
    /*
     *  版本1 向 版本2 数据迁移
     */
    - (void)v1ToV2{
    
        [_queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            @try {
    
                //将原始表名T1 修改为 tempT1
                NSString *renameString = @"alter table t1 rename to tempT1";
                [db executeUpdate:renameString];
    
                //创建新表T1(V2版本的新表创建)
                [db executeUpdate:createTable];
    
                //迁移数据
                NSString *toString = @"insert into t1(name,sex)  select name,sex from tempT1";
                [db executeUpdate:toString];
    
                //删除tempT1临时表
                NSString *dropTableStr1 = @"drop table tempT1";
                [db executeUpdate:dropTableStr1];
            }
            @catch (NSException *exception) {
                *rollback = YES;
            }
        }] ;
    
    
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInteger:DBVersionV2] forKey:DBVersionNum];
    }
    

    相关文章

      网友评论

          本文标题:数据库的版本升级

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