一、SQLite升級和降級需要考慮的細節
① SQLite升級:
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()
② SQLite 降級:
降級由於情況太多,復雜所以我們只做數據庫V3.0降級到數據庫V2.0:
降級的設計關鍵點
1、考慮雲端要保存用戶【自定義數據、行為習慣】。專業術語profile-->>提高用戶黏度
2、考慮[當前]的最低版本要求-->>降低維護成本
3、盡可能本地的數據轉移(所有新版本,都不刪除字段)-->盡可能把未知變已知
try catch
③onCreate()和onUpgrade()升級,onDowngrade()降級方法執行的時機:
在上一張章onCreate和onUpgrade方法執行的時機博客中我們知道,先獲取數據庫的當前版本,當版本號為0的時候,就會執行onCreate方法(當數據庫文件第一次創建的時候版本號就是0)如果版本號不為0,同時和最新版本號進行比較,如果大於的話,就執行升級操作onUpgrade方法,否則就執行降級onDowngrade方法。
二、相關代碼:
1、升級:
創建一個openHelper3.java
openHelper3.java文件:
public class openHelper3 extends SQLiteOpenHelper { private static final String DB_NAME = "mydata.db"; // 數據庫名稱 private static final int version = 1; // 數據庫版本 public openHelper3(Context context) { super(context, DB_NAME, null, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub // 編寫【從0開始到最新狀態】建表語句 Log.i("hi", "沒有數據庫,創建v4.0數據庫"); //0-->v3.0 String sql_message = "create table t_message (id int primary key,userName varchar(50),lastMessage varchar(50),datetime varchar(50),isdel bit default 0)"; String inse="insert into t_message values(1,'TT','一起去旅游','10月1號',0)"; db.execSQL(sql_message); db.execSQL(inse); Log.i("d","ok"); } //升級 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub //v1.0-->v3.0 if(oldVersion==1) { String inse2="insert into t_message values(2,'TT2','一起去旅游','10月1號',0)"; String inse3="insert into t_message values(3,'TT3','一起去旅游','10月1號',0)"; db.execSQL(inse2); db.execSQL(inse3); Log.i("hi", "升級v1.0-->v3.0數據庫"); } //v2.0--->3.0 if(oldVersion==2) { String sql="alter table t_message add column isdel bit default 0"; db.execSQL(sql); Log.i("hi", "升級v2.0-->v3.0數據庫"); } } }
1、該類繼承SQLiteOpenHelper對數據庫進行相關的操作。
2、在onCreate()的方法創建表和添加數據,首先我們知道有3種情況 0-->v3.0,1-->v3.0,2-->v3.0。
3、onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)升級方法,在onCreate()和onUpgrade,onDowngrade()方法執行的時機知識點我們知道了執行順序。所以在onCreate()方法中我們用來創建最新版本也就是0-->v3.0。
4、在onUpgrade()方法中我們可以通過oldVersion(舊版本)參數來進行判斷,進行相關的操作。
2、降級:
降級操作我們只需在 openHelper3.java文件文件中添加一個onDowngrade()降級方法。
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { try { //第一、先把t_message 未來的表,改名 String alt_table="alert table t_message rename to t_message_bak"; db.execSQL(alt_table); //第二、建立2.0的表結構 String crt_table = "create table t_message (id int primary key,,userName varchar(50),lastMessage varchar(50),datetime varchar(50))"; db.execSQL(crt_table); //第三、把備份的數據,copy到 新建的2.0的表 String cpy_table="insert into t_message select id,userName,lastMessage,datetime from t_message_bak"; db.execSQL(cpy_table); //第四、把備份表drop掉 String drp_table = "drop table if exists t_message_bak"; db.execSQL(drp_table); } 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,userName varchar(50),lastMessage varchar(50),datetime varchar(50))"; String sql_init_1 = "insert into t_message values (2,'TT2','一起去旅游','10月1號')"; String sql_init_2 = "insert into t_message values (2,'TT2','一起去旅游','10月1號')"; String sql_init_3 = "insert into t_message values (2,'TT2','一起去旅游','10月1號')"; 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); } }
這種情況是在已知備份了V2.0的數據,將V3.0的改名並且將數據復制到V2.0新建的表中,因為表結構可能存在差異導致復制失敗,所以添加異常處理,如果降級失敗,就刪除原來的表重新建回v2.0的數據表,這樣依舊可以實現重v3.0降級到v2.0。