数据库table升级,加了一列,在onCreate和onUpgrade都加了相应column,版本号也升级了。结果发现部分升级安装的用户出现崩溃。崩溃信息如下
java.lang.IllegalStateException: Couldnt read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:434)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:62)
at android.database.CursorWrapper.getString(CursorWrapper.java:114) ....
定位到getColumnIndex(column) 返回值-1,即没找到列名
经过排查,发现是其他table的升级sql执行抛出了异常,客户端把它catch住了...然而android在抛出这个异常的时候同时把数据库关闭了,整个升级是个事务,没有升级成功。
教训:
1、getColumnIndex要加保护
2、不是所有的异常都catch,在debug的时候应该让它抛出来,便于早点发现问题