安卓在SQLiteOpenHelper类进行版本升级和降级

一、升级(使用到onUpgrade()方法和onCreate()没有安装过才用到)

简单理一下思路:

 v1.0 (也就是说第一次使用这软件,没有安装过 所有在onCreate() 方法里写代码)
  1.没有安装过    onCreate() 

--------------------------------------
v2.0   [onUpgrade 情况:n-1,onCreate 情况:1]  (这是第二个版本,有两种可能的升级路线,第一条是从版本1到版本2,第二种是第一次安装【也相当于一次性从版本1到2】)
  1.v1.0 --> v2.0    onUpgrade 
  2.没有安装过       onCreate() 
-----------------------------------------
v3.0   [onUpgrade 情况:n-1,onCreate 情况:1] ( 同理升级第三版本。。。。。。)
  1. v1.0 -->v3.0    onUpgrade 
     alter table t_message add column isdel bit default 0;
     插入数据
*  2. v2.0 -->v3.0    onUpgrade  
       alter table t_message add column isdel bit default 0;
  3. 没有安装过       onCreate()  
-----------------------------------------
 
首先创建一个类MyDatabaseOpenHelper继承SQLiteOpenHelper并实现方法
 
先创建第一个版本的数据库(数据库名是mydata.db,版本是1)

因为是第一次所以在onCreate 里写添加表的代码(表名sql_message,有五列)

最后运行,然后在ddms里面的data分区下的data文件夹中找到生成的mydata.db数据库文件拷贝到d盘,如图

然后启动dos命令对mydata.db进行操作看能否查到我们刚刚添加的表

找到了 也相当于第一个版本只有表还没有添加数据 现在我们正式升级到2.0 也就是添加几条数据

那么根据前面的逻辑思路 我们是从1.0到2.0,所以需要在onUpgrade()方法里进行升级,代码如下:

先把版本改为2(也就是说新版本号是2,老版本是1)

升级(在 onUpgrade编写)

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

//判断老版本是不是等于1(是的现在我们升级到2)
if (oldVersion == 1) {

//我表里添加三条数据
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
Log.i("db", "从1到2,升级成功!");  //提示语
}
}

最后运行然后又拿到mydata.db又在dos查询看

 那如果用户从来没有安装过,第一次安装2.0版本(记住是1.0到2.0了哦) 就要在onCreate 里面写上创建表的代码和添加数据的代码 两个都要写哦,

public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 编写【从0开始到最新状态】建表语句
Log.i("hi", "没有数据库,创建数据库,创建v2.0成功");
String sql_message = "create table t_message " +"(id int primary key,tou1 varchar(50),userName varchar(50)," +"lastMessage varchar(50),datetime varchar(50))";   //创建表
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";   //添加数据
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_message);  //先执行创建表,再添加数据
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}

以此类推  如果要升级到好多版本的话就只需要在onUpgrade里判断老版本号来编写升级所改动的表结构 最后执行数据库操作,升级无非是对数据表的结构发生改变而已 来改变用户需求达到升级的

二、降级(onDowngrade()方法)

降级的设计关键点
1、考虑云端要保存用户【自定义数据、行为习惯】。专业术语profile-->>提高用户黏度
2、考虑[当前]的最低版本要求-->>降低维护成本
3、尽可能本地的数据转移(所有新版本,都不删除字段)-->尽可能把未知变已知
代码需要try catch来包住 防止降级失败

我们这里用到也是上面升级到3.0的版本,就是说将在2.0基础上添加多一列的3.0降回到2.0  上面我们没讲2.0如何升级到3.0(简单说就是多加一列)  现在有降到2.0

那么我们首先要保证我们的mydata.db是3.0的版本

版本改为2.0

在onDowngrade方法里写降级代码:

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//正常来讲大于2.0的,应该有t_message 这张表,且2.0有的字段,3.0都有
try {
//第一、先把t_message 未来的表,改名
String rename_sql = "alter table t_message rename to t_message_bak";
db.execSQL(rename_sql);
Log.i("down", "1.改名成功");
//第二、建立2.0的表结构
String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
db.execSQL(sql_message);
Log.i("down", "2.建立2.0表结构成功");
//第三、把备份的数据,copy到 新建的2.0的表
String sql_copy = "insert into t_message select id,tou1,userName,lastMessage,datetime from t_message_bak";
db.execSQL(sql_copy);
Log.i("down", "3.copy到用户数据到 2.0的表");
//第四、把备份表drop掉
String drop_sql = "drop table if exists t_message_bak";
db.execSQL(drop_sql);
Log.i("down", "4.把备份表drop掉");

} catch (Exception e) {
//失败
Log.i("hi", "降级失败,重新建立");
String sql_drop_old_table = "drop table if exists t_message";
String sql_message = "create table t_message (id int primary key,tou1 varchar(50),userName varchar(50),lastMessage varchar(50),datetime varchar(50))";
String sql_init_1 = "insert into t_message values (1,'abc','abc1','abcd1','hi1')";
String sql_init_2 = "insert into t_message values (2,'abc','abc2','abcd2','hi1')";
String sql_init_3 = "insert into t_message values (3,'abc','abc2','abcd2','hi1')";
db.execSQL(sql_drop_old_table);
db.execSQL(sql_message);
db.execSQL(sql_init_1);
db.execSQL(sql_init_2);
db.execSQL(sql_init_3);
}
}

  
原文地址:https://www.cnblogs.com/chaowang/p/6119620.html