Android項目管理之數據庫升級策略

Android數據庫升級策略sql


一:問題產生的通常緣由
版本的升級引起以往的數據結構不能知足新的要求
新的數據表的不斷引入
小版本迭代可能會致使數據庫的頻繁變動
二:目前經常使用的方案
方案:
每次更新數據庫時,刪除舊的數據,從新建表
避免使用複雜的數據表,採用json或者xml存儲
對數據庫的每次變動作記錄,在升級時執行變動的記錄
分析:
能夠避免數據庫變動對新版本程序的影響,可是用戶數據會被清除,能夠考慮將重要的數據存儲到SharedPreference中去。
該方式避免的數據庫變動可能產生的全部問題,可是整理上的性能和內存消耗會比較大。
該方式稍微複雜,可是是比較理想的解決方案,既避免了數據被清除掉,也避免了性能和內存消耗
三:本文討論的方案
本文主要討論二中的第三種方案,進行增量式數據變動
思路:
創建配置文件,存儲數據庫版本號,每次數據庫變動的時候將該版本號+1
創建數據變動配置文件,每一行記錄一個版本的數據變動
應用啓動執行到自定義的SQLiteOpenHelper的public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法時,首先執行配置文件中的版本變動記錄,而後執行onCreate()方法
實現:
DBHelper構造,傳入配置文件中的數據庫版本號
 數據庫

  
  
  
  
  1. private DBHelper(Context context, String name, CursorFactory factory, 
  2.             int version) { 
  3.         super(context, name, factory, version); 


create
 json

  
  
  
  
  1. public void onCreate(SQLiteDatabase db) { 
  2.     //這裏建庫時記得這樣就行了CREATE TABLE IF NOT EXISTS 


onUpgrade
 數據結構

  
  
  
  
  1. /** 
  2.      * 數據庫升級時,根據配置文件中的配置信息進行升級,能夠涉及到添加字段,具體升級配置在res/raw/system.properties文件中定義 
  3.      */ 
  4.     @Override 
  5.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
  6.         executeLocalSQL(db); 
  7.         onCreate(db); 
  8.     } 


executeLocalSQL
 app

  
  
  
  
  1. /** 
  2.      * @Title: executeLocalSQL 
  3.      * @Description: 執行本地SQL語句 
  4.      * @param 設定文件 
  5.      * @return void 
  6.      */ 
  7.     private void executeLocalSQL(SQLiteDatabase db) { 
  8.         ArrayList<String> sqlList = getLocalSQL(); 
  9.         for (int i = 0, l = sqlList.size(); i < l; i++) { 
  10.             try { 
  11.                 db.execSQL(sqlList.get(i)); 
  12.             } catch (Exception e) { 
  13.                 Util.log(e.getMessage()); 
  14.             } 
  15.         } 
  16.     } 


獲取本地數據變動記錄
 ide

  
  
  
  
  1. private ArrayList<String> getLocalSQL() { 
  2.         ArrayList<String> result = new ArrayList<String>(); 
  3.         InputStream is = null
  4.         InputStreamReader reader = null
  5.         BufferedReader br = null
  6.         try { 
  7. //            is = Variable.appllicationContext.getResources().getAssets().open("dbchange.txt"); 
  8.             is = Variable.appllicationContext.getResources().openRawResource( 
  9.                     R.raw.alter); 
  10.             reader = new InputStreamReader(is); 
  11.             br = new BufferedReader(reader); 
  12.             String line = null
  13.             while((line = br.readLine()) !=null){ 
  14.                 result.add(line); 
  15.             } 
  16.         } catch (FileNotFoundException e) { 
  17.             e.printStackTrace(); 
  18.         } catch (IOException e) { 
  19.             e.printStackTrace(); 
  20.         }finally
  21.             Util.closeStream(br); 
  22.             Util.closeStream(reader); 
  23.             Util.closeStream(is); 
  24.         } 
  25.         return result; 
  26.     } 
相關文章
相關標籤/搜索