Android數據庫升級策略sql
一:問題產生的通常緣由
版本的升級引起以往的數據結構不能知足新的要求
新的數據表的不斷引入
小版本迭代可能會致使數據庫的頻繁變動
二:目前經常使用的方案
方案:
每次更新數據庫時,刪除舊的數據,從新建表
避免使用複雜的數據表,採用json或者xml存儲
對數據庫的每次變動作記錄,在升級時執行變動的記錄
分析:
能夠避免數據庫變動對新版本程序的影響,可是用戶數據會被清除,能夠考慮將重要的數據存儲到SharedPreference中去。
該方式避免的數據庫變動可能產生的全部問題,可是整理上的性能和內存消耗會比較大。
該方式稍微複雜,可是是比較理想的解決方案,既避免了數據被清除掉,也避免了性能和內存消耗
三:本文討論的方案
本文主要討論二中的第三種方案,進行增量式數據變動
思路:
創建配置文件,存儲數據庫版本號,每次數據庫變動的時候將該版本號+1
創建數據變動配置文件,每一行記錄一個版本的數據變動
應用啓動執行到自定義的SQLiteOpenHelper的public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 方法時,首先執行配置文件中的版本變動記錄,而後執行onCreate()方法
實現:
DBHelper構造,傳入配置文件中的數據庫版本號
數據庫
- private DBHelper(Context context, String name, CursorFactory factory,
- int version) {
- super(context, name, factory, version);
- }
create
json
- public void onCreate(SQLiteDatabase db) {
- //這裏建庫時記得這樣就行了CREATE TABLE IF NOT EXISTS
- }
onUpgrade
數據結構
- /**
- * 數據庫升級時,根據配置文件中的配置信息進行升級,能夠涉及到添加字段,具體升級配置在res/raw/system.properties文件中定義
- */
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- executeLocalSQL(db);
- onCreate(db);
- }
executeLocalSQL
app
- /**
- * @Title: executeLocalSQL
- * @Description: 執行本地SQL語句
- * @param 設定文件
- * @return void
- */
- private void executeLocalSQL(SQLiteDatabase db) {
- ArrayList<String> sqlList = getLocalSQL();
- for (int i = 0, l = sqlList.size(); i < l; i++) {
- try {
- db.execSQL(sqlList.get(i));
- } catch (Exception e) {
- Util.log(e.getMessage());
- }
- }
- }
獲取本地數據變動記錄
ide
- private ArrayList<String> getLocalSQL() {
- ArrayList<String> result = new ArrayList<String>();
- InputStream is = null;
- InputStreamReader reader = null;
- BufferedReader br = null;
- try {
- // is = Variable.appllicationContext.getResources().getAssets().open("dbchange.txt");
- is = Variable.appllicationContext.getResources().openRawResource(
- R.raw.alter);
- reader = new InputStreamReader(is);
- br = new BufferedReader(reader);
- String line = null;
- while((line = br.readLine()) !=null){
- result.add(line);
- }
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- }finally{
- Util.closeStream(br);
- Util.closeStream(reader);
- Util.closeStream(is);
- }
- return result;
- }