SqliteOpenHelper的onUpgrade()死活不運行的解法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM