Android之sqlite數據庫版本升級和降級的處理(onUpgrade和onDowngrade)


一、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。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM