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

时间: 2024-10-15 16:52:32

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

mysql 数据库数据迁移 The user specified as a definer ('root'@'%') does not exist 解决方法

从一个数据库数据迁移到本地localhost 程序在调用到数据库的视图时报错,直接在数据库中打开视图时也报错,类似: mysql 1449 : The user specified as a definer ('montor'@'%') does not exist 经查,是权限问题,解决办法: 运行:grant all privileges on *.* to [email protected]"%" identified by "."; 之后打开视图时便不会报错

oracle 数据库数据迁移解决方案

大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,接下来把心得与大家分享一下 去年年底做了不少系统的数据迁移,大部分系统由于平台和版本的原因,做的是逻辑迁移,少部分做的是物理迁移,有一些心得体会,与大家分享. 首先说说迁移流程,在迁移之前,写好方案,特别是实施的方案步骤一定要写清楚,然后进行完整的测试.我们在迁移时,有的系统测试了四五次,通过测试来完善方案和流程. 针对物理迁移,也即通过RMAN备份来进行还原并应用归档的方式(这里不讨论通过dd方式进行的冷迁移),虽然注意的是

Android 一键直接查看Sqlite数据库数据

本文主要介绍Android开发中如何一键直接查看sqlite数据库中的数据以及sqlite3的常用命令.1.原始查看sqlite数据方法Eclipse 菜单Window - Open Perspective - DDMS进入DDMS视图.然后File Explorer View中依次展开路径/data/data/package_name/databases/,将其中的db文件pull from device保存到电脑上,再使用navicat.SQLiteSpy或其他软件打开查看,整个过程相当复杂

mysql数据库数据迁移方法

说明:这里不讨论命令行还有通过navicat等工具的做法,这里只讨论在mysql坏掉(不能启动)的情况下,怎么办. 方法: a) 先来看mysql数据库文件的情况: mysql坏掉了,不管是linux还是windows版本,mysql有个数据库文件目录data目录,如下图: (注意linux版上面的是my.cnf差不多) 然后data目录里面类似这样: 通过观察可以知道里面一个个文件夹如world这些就是一个个database.进入这个文件就是类似下面两种情况: 情况一:           

MySQL数据库数据迁移:从一个服务器到另一个服务器

需要两个服务器数据库版本相同才可迁移 1:单个或多个数据库 mysqldump -h远程ip -u用户 -p密码 -P3306 --default-character-set=utf8 --databases 单个或多个数据库名称空格分开 | mysql -h127.0.0.1 -uroot -p -P3306 执行后输入本地数据库密码即可 2:所有数据库 mysqldump -h远程ip -u用户 -p密码 -P3306 --default-character-set=utf8 --all-d

vs实现数据库数据迁移

public ActionResult About() { List<ChangeData.Models.old.adsinfo> adsinfo_new = new List<Models.old.adsinfo>();//实例化一个LIST装载旧的表格 using (Model2 m2 = new Model2()) { adsinfo_new = m2.adsinfo.ToList();//m2广告表的一条数据读取出来并创建一个List } using (Model1 m1

Android版本升级同时Sqlite数据库的升级及之前数据的保留

http://www.cnblogs.com/wang340/archive/2013/05/06/3063135.html http://www.eoeandroid.com/forum.php?mod=viewthread&tid=166052 做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已

【转】Android版本升级同时Sqlite数据库的升级及之前数据的保留

做Android应用,不可避免的会与SQLite打交道.随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了. SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段.并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;2 ALTER TABLE Sub

Code First Migrations更新数据库结构(数据迁移) 【转】

背景 code first起初当修改model后,要持久化至数据库中时,总要把原数据库给删除掉再创建(DropCreateDatabaseIfModelChanges),此时就会产生一个问题,当我们的旧数据库中包含一些测试数据时,当持久化更新后,原数据将全部丢失,故我们可以引入EF的数据迁移功能来完成. 要求 已安装NuGet 过程示例 [csharp] view plaincopyprint? //原model //原model [csharp] view plaincopyprint? us