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();