自己的機器 android 2.3,刷的小米系統,曾經執行成功過一次,前後傳的版本號碼也正確,後來死活不執行,確實是調用的getWritableDatabase(),看了Android源碼,也沒發現異常。
百思不得其解!換了公司的一台測試機,又可以。
由此暫時斷定這個onUpgrade不靠譜,自己寫了一套升級sqlite資料庫的邏輯。
在assets下做一個update.sql檔案,然後讀取檔案,一行行的執行sql;若升級成功,在庫裡面寫個標記。
注意:update.sql裡面,一個完整的操作,其包含的句子需要合并成一行。
代碼如下(只是思路,不可直接copy使用):
private void updateDB() { SqliteHelper sqliteHelper = SqliteHelper.getInstance(this); if (!("" + Config.SQLITE_DB_VERSION) .equals(sqliteHelper.getValue(Configuration.DB_VERSION))) { LogUtil.i(TAG, "=====資料庫升級開始====="); // sqliteHelper.beginTransaction(); try { InputStream in = this.getAssets().open("update.sql"); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(in)); String tmpStr = null; StringBuffer sql = new StringBuffer(); while ((tmpStr = bufferedReader.readLine()) != null) { sql.append(tmpStr); sql.append("\n"); if (tmpStr.trim().endsWith(";")) { sqliteHelper.execSQL(sql.toString()); sql = new StringBuffer(); } } bufferedReader.close(); in.close(); // sqliteHelper.setTransactionSuccessful(); sqliteHelper.setValue(Configuration.DB_VERSION, "" + Config.SQLITE_DB_VERSION); LogUtil.i(TAG, "=====資料庫升級成功!====="); } catch (Exception e) { LogUtil.e(TAG, e.getMessage()); } finally { // sqliteHelper.endTransaction(); } } }