iOS数据库版本升级问题

项目中遇到一个数据库版本升级问题,最后还是解决了,现在来记录下这个坑。
iOS项目中有数据库方面的知识,之后的数据库表比较简单,为了实现产品经理给的需求,不得不和服务器那边协调通过增加数据表字段的方式来达到目的。之前,没有做数据库版本的记录问题,需求什么的都滚一边,产品太不专业了。现在我的需求是在不改变原来APP上的数据的基础上增加新的字段来实现消息推荐的已同意拒绝过期等状态。刚开始时,觉得这个问题不是很难,所以有点大意了,中间遇到很多坑,SQLite语法很严谨,所以遇到各种语法问题。还好,之前到随手记面试的时候,也遇到过这个面试题,当时没想太多,就说每次删掉旧的数据库DB,现在想想当时脑袋被门挤了吧。废话不多说,说多了也是泪啊。。
我的思路:要想确保之前的数据不丢失,应当在之前数据库表的基础上创建新的数据库表,哈哈,解决方案应运而生了。
1.判断数据库版本号和保存数据库版本号

NSString * const kdbManagerVersion = @"DBManagerVersion";

const static NSInteger DB_MANAGER_VER = 1;

// 升级操作

NSInteger ver = [[NSUserDefaults standardUserDefaults] integerForKey:kdbManagerVersion];
        
if (ver < DB_MANAGER_VER) {
     [self upgrade];
}

- (void)saveDBVersion {
    [[NSUserDefaults standardUserDefaults] setInteger:DB_MANAGER_VER forKey:kdbManagerVersion];
    [[NSUserDefaults standardUserDefaults] synchronize];
}

2.数据库升级

- (void)upgrade {
     // 获取旧版本号
     NSInteger oldVersionNum = [[NSUserDefaults standardUserDefaults] integerForKey:kdbManagerVersion];
     if (DB_MANAGER_VER <= oldVersionNum) {
        return;
     }
     // 升级
     [self upgrade:oldVersionNum];

     // 保存新版本号
     [self saveDBVersion];
 }

 - (void)upgrade:(NSInteger)oldVersion {
      if (oldVersion >= DB_MANAGER_VER) {
          return;
      }
      switch (oldVersion) {
         case 0:
            [self upgradeFromOldToNew];
            break;
         case 1:
            [self upgradeFromOldToNew];
            break;
         case 2:
        
            break;
         default:
            break;
       }
       oldVersion++;

       // 判断是否需要升级
       [self upgrade:oldVersion];
  }

  - (void)upgradeFromOldToNew {
       // 执行版本1到版本2的更新
       [self changeDBData:_db];
  }

3.数据库升级的SQL语句操作

- (void)changeDBData:(FMDatabase *)db {
      [db open];
      // 变更数据库表为一个旧数据表
      NSString *sqlStr = [NSString stringWithFormat:@"ALTER TABLE %@ RENAME TO %@", self.tableName, [self.tableName stringByAppendingString:@"_Old"]];
     // 执行SQL语句操作
       [db executeUpdate:sqlStr];
     // 创建新的数据表
       NSString *executeStr = [NSString stringWithFormat:@"create table if not exists %@ (LocID integer primary key autoincrement not null,messageID text unique,Content text,TypeName text,SendTime text,CreateTime integer,Status integer,msgtype text,apply_id text,userid text,message_last_id text)",self.tableName];
      BOOL bRet = [db executeUpdate:executeStr];
      if (bRet) {
      // 从旧数据表把旧数据插入新的数据表中
          NSString *insertSql = [NSString stringWithFormat:@"INSERT INTO %@ SELECT * ,'','','' FROM %@", self.tableName, [self.tableName stringByAppendingString:@"_Old"]];
          [db executeUpdate:insertSql];
     }
    // 删除旧的数据表
     [db executeUpdate:[NSString stringWithFormat:@"DROP TABLE %@",      [self.tableName stringByAppendingString:@"_Old"]]];
     [db close];
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,478评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,825评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,482评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,726评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,633评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,018评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,168评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,320评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,264评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,288评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,995评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,587评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,909评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,284评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,862评论 2 339

推荐阅读更多精彩内容