记一次Android数据库升级bug

 @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        LogUtils.d(TAG, "onUpgrade");
        switch (oldVersion) {
        case 1://version1
            //……
        case 2://version2
            db.execSQL(sql_emoji);
        case 3://version3
            String leastAdd = "ALTER TABLE " + TABLE_NAME_LEAST + " ADD COLUMN format varchar(10)";  // 增加'format'字段  标识文字表情
            db.execSQL(leastAdd);case 4:
            LogUtils.d(TAG, "sql onUpgrade 4->5");

            db.execSQL(sql_update_collect_url);//要加try catch,SQLiteConstraintException: UNIQUE constraint failed: least_use_expression.url
            db.execSQL(sql_update_least_use_url);

            db.execSQL(sql_compilation);
            db.execSQL(sql_compilation_relation);
     default: break; } }

   如上是数据库升级代码,之前版本一直没有出过问题。从4-》5却又好几个用户反馈,但绝大多数用户没有问题,测试过程中也没发现问题。猜测是部分用户特定的数据导致数据库升级失败。仔细检查发现前2行对数据库操作可能会导致主键冲突,尝试加入try、catch后问题解决。

  结论:对于可能导致操作异常的sql语句增加try、catch,但是不能对所有sql语句增加try、catch,因为有的数据必须要执行才能保证正常功能。比如新建数据库等。

posted @ 2017-03-20 11:31  自强自律  阅读(573)  评论(0编辑  收藏  举报