• 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();
                }
            }
        }
    本博客所有随笔,若未明确标示为转载或未带有原文链接,皆为原创。
    本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
    • 出处:http://kaima.cnblogs.com
    • 作者:kai.ma
  • 相关阅读:
    底图的移动(setinterval 设置移动速度)
    Arrays的一点了解
    GestureDetector
    IO问题
    IO流
    Android动画
    Android中的Manager们
    Android对话框
    Android自定义View
    Android中关于Intent
  • 原文地址:https://www.cnblogs.com/kaima/p/2932303.html
Copyright © 2020-2023  润新知