一、升级(使用到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);
}
}