2012年12月29日 星期六

[Android]資料庫更新

一個App寫好後,通常過了一段時間後突然發現有些功能不太夠用,要寫新功能,但左思右想,這個新功能需要在原本的資料庫增加欄位,這時候就比較麻煩了...

最快的作法是把舊的資料表刪除,然後重新建新的資料表,可是當我已經有廣大的使用者族群的時候,刪除舊資料對使用者來說是個災難性的體驗,所以這個方案在已經上線的app不太適用...
但如果再刪除之前,先把資料都存起來,這樣好像也滿複雜的,我只是想要把其中一個資料表增加欄位啊...

這裡查到一個不錯的作法,記錄於此備份一下,這裡的方法利用資料庫Transaction的功能。作法如下:

  1. 修改DBHelpler裡的資料庫版本,若原本是1,就要+1修改成2
  2. 一樣在onCreate()把最初建立的資料庫欄位做調整,程式碼範例:
    //輔助類建立時運行該方法
       @Override
       public void onCreate(SQLiteDatabase db) {
       String DATABASE_CREATE_TABLE =
              "create table newMemorandum("
     + "_ID INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL,"
            + "date VARCHAR,"
            + "note VARCHAR,"
            + "pw VARCHAR,"
            + "reminder INT,"//新增欄位
            + "type VARCHAR,"//新增欄位
            + "memo VARCHAR"//新增欄位
            + ")";
           db.execSQL(DATABASE_CREATE_TABLE);
    }
  3.  Overide函數 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),程式碼範例如下:
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      //oldVersion=舊的資料庫版本;newVersion=新的資料庫版本
     
      if (newVersion > oldVersion) {
       db.beginTransaction();//建立交易
         
        boolean success = false;//判斷參數
            
        //由之前不用的版本,可做不同的動作    
        switch (oldVersion) {
        case 1:          
          db.execSQL("ALTER TABLE newMemorandum ADD COLUMN reminder integer DEFAULT 0");
          db.execSQL("ALTER TABLE newMemorandum ADD COLUMN type VARCHAR");
          db.execSQL("ALTER TABLE newMemorandum ADD COLUMN memo VARCHAR");
          oldVersion++;
                 
         success = true;
         break;
        }
                    
         if (success) {
           db.setTransactionSuccessful();//正確交易才成功
          }
        db.endTransaction();
      }
      else {
        onCreate(db);
      }  
    }
完成以上 內容後,程式就會自動判斷資料庫的版本再進行Upgrade的動作。

沒有留言: