天天看點

Android SQLite 資料庫 java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow異常

有時候很小的一個馬虎,就會導緻很多錯誤。近來在做項目的時候,遇到如下異常:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.

插入資料庫的操作如下:

ContentResolver resolver = mActivity.getContentResolver();
ContentValues values = new ContentValues();
String extInfo = "sth";
values.put(MyContract.EXT_INFO, extInfo);
resolver.insert(MyContract.MSG_URI, values);
           

查詢資料庫的操作如下:

Cursor cursor = mService.getContentResolver().query(MyContract.MSG_URI, null, MyContract.MSG_ID + "=?", new String[] { msgId }, null);
String extInfo = cursor.getString(cursor.getColumnIndex(MyContract.EXT_INFO));
           

此時會報錯,問題出現在這一行:

cursor.getColumnIndex(MyContract.EXT_INFO)
           

經過debug後發現,

cursor.getColumnIndex(MyContract.EXT_INFO)
           

傳回的值是-1,即沒找到這個字段。

經過分析,發現MyContract.EXT_INFO的值是

public static final  String EXT_INFO ="ext_info ";
           

這裡多了一個空格,是以導緻插入資料庫的時候沒問題,查詢資料庫的時候找不到。我想這應該是Android的一個bug,即插入操作是按照變量EXT_INFO的字段名(包含一個空格)插入的,調用getColumnIndex(MyContract.EXT_INFO)方法的時候去掉了變量EXT_INFO的空格。