@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,因为有的数据必须要执行才能保证正常功能。比如新建数据库等。