一、升級(使用到onUpgrade()方法和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()

因為是第一次所以在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);
}
}