自己的機器 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(); } } }