Android 版本升级涉及到的数据库数据迁移问题

Posted

Wicrecend

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 版本升级涉及到的数据库数据迁移问题相关的知识,希望对你有一定的参考价值。

最近做老版本向新版本升级,新版本增加了几张表,有的表经过了增加字段。那么如何把老的数据迁移到新的版本里呢?


我写了一段伪代码,是关于我们项目里的 用户登录信息 Users表,    历史表history(用户浏览过的帖子论坛,收藏过的帖子论坛)


我里面还涉及到接口的调用。

另外说明一点,这段代码是无法在 onUpdateGrade()里面调用的,具体什么原因我也不清楚。另外表的结构发生改变,事务也不好使了。

#是注释部分,事务最终被注释掉了


User  user = null;
if(登录){
     
   try{
     #请求获取好友资料接口
     User  user = helper.getUserInfo(xxx);
     
   
      #设置 DataCache.isLogin = true;
      #设置 DataCache.user   调用updateUserInfo();



    }catch{
       #设置sp里 DB_MOVE_133_TO_201 = false ;
       DataCache.isLogin = false;
    }

  }else{
     DataCache.isLogin = false;
     user = null;

  }

#整个操作在事务中完成
SQLiteDatabase db = ....;
#db.beginTransaction();//开始事务

#迁移Users
 

   #1. 将Users表改为临时表temp_Users
 
        ALTER TABLE Users RENAME TO Users_temp;

   #2. 创建新表

     create table Users (  _id  INTEGER PRIMARY KEY AUTOINCREMENT,
                 userName varchar(50) not null,
                 loginName varchar(50) not null,
                 weiWang varchar(50) not null,
                 iscarowner varchar(50) not null,
                 sex varchar(50) not null,
                 provinceid varchar(50) not null,
                 provincename varchar(50) not null,
                 cityid varchar(50) not null,
                 cityname varchar(50) not null,
                 score varchar(50) not null,
                 userid varchar(50) not null,
                 rigisttime varchar(50) not null,
                                 isAutoLogin int not null,
                 pwd int not null,
                 userPic varchar(50) not null,
                 memberId varchar(50) not null,
                 Key varchar(500) not null);

   
    #3. 导入数据  
    
     
     INSERT INTO Users SELECT _id,userName,loginName,‘0‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,‘‘,isAutoLogin,pwd,‘‘,‘‘,Key FROM Users_temp;

    #4. 删除临时表 
    
    DROP TABLE Users_temp


#迁移history数据步骤

#1. 将history表改为临时表temp_history
   
    ALTER TABLE history RENAME TO history_temp;

#2. 创建新表
  create table history (_id  INTEGER PRIMARY KEY AUTOINCREMENT,
                                         userid varchar(50) not null default ‘0‘,  
                     datasource varchar(12) not null default ‘0‘,  
                     handleaction varchar(12) not null default ‘0‘,  
                     historyId varchar(12) not null,
                     title varchar(50) not null,
                     bbsId varchar(12) not null,
                     bbsType varchar(12) not null,
                     typeid varchar(12) not null,
                     viewtime varchar(50) not null);

#3. 导入数据  
    
     INSERT INTO history SELECT _id,‘0‘,‘0‘,‘0‘,historyId,title,bbsId,bbsType,typeid,viewtime FROM history_temp;


#4. 若是登录用户,则更新userid字段

    UPDATE history set userid=?;

    例如:  UPDATE history set userid=587766;

#5. 删除临时表 
    
    DROP TABLE history_temp
    
 
   #db.setTransactionSuccessful();//调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
   
   #设置sp里 DB_MOVE_133_TO_201 = true ;
 
 } finally {
       #db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务
  }
    db.close();    

以上是关于Android 版本升级涉及到的数据库数据迁移问题的主要内容,如果未能解决你的问题,请参考以下文章

BAT求职大礼包 | 你的秋招网申时间余额不足,腾讯面试经验

迁移室数据库,alter table,android?

Elasticsearch数据迁移或者版本升级,如何快速提升迁移效率?

Elasticsearch数据迁移或者版本升级,如何快速提升迁移效率?

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

Android Studio 升级为3.1 踩到的坑