一、问题:
android开发中Cursor使用时的错误。错误:java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
二、情景:
android sql查询时,使用到了cursor对象。代码如下:
if(cursor.moveToFirst()){
do{
String name = cursor.getString(cursor.getColumnIndex("name"));
String tel = cursor.getString(cursor.getColumnIndex("tel"));
String remark = cursor.getString(cursor.getColumnIndex("remark"));
String group = cursor.getString(cursor.getColumnIndex("group_lpcolumn"));
int selectTemp = cursor.getInt(cursor.getColumnIndex("select_lpcolumn"));
boolean select = true;
if(selectTemp==0){
select = false;
}
User user = new User();
user.setName(name);
user.setTel(tel);
user.setRemark(remark);
user.setGroup(group);
user.setSelect(select);
arrayList.add(user);
}while (cursor.moveToNext());
}
cursor.close();
出错的地方是
String group = cursor.getString(cursor.getColumnIndex("group_lpcolumn"));
int selectTemp = cursor.getInt(cursor.getColumnIndex("select_lpcolumn"));《现在这是正确的代码》
这两行。因为我的User类中字段是group和select,所以原来写的代码是
String group = cursor.getString(cursor.getColumnIndex("group")); int selectTemp = cursor.getInt(cursor.getColumnIndex("select"));《这是错误的代码》
就报上面那个错误了。
这是因为我创建库、存储数据等的时候使用的LitePal开源库,而group和select是sql关键字或保留字段,应该是litePal做了处理。导致cursor.getColumnIndex("group")返回的值是-1。
三、解决方式:
可以使用cursor的方法getColumnIndexOrThrow(String),此方法会输出更清楚的错误原因。更清楚的错误提示如下:
java.lang.IllegalArgumentException: column 'group' does not exist. Available columns: [id, group_lpcolumn, name, remark, select_lpcolumn, tel]
at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:352)
那么找到原因就好修改了。
所以数据库字段尽量不要使用关键字或保留字为好。