Java 通过空检查的游标索引越界异常
我在这里查了一大堆问题,找不到正确答案。我在从数据库检索数据时遇到问题。我得到android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0exception。我创建数据库的代码:Java 通过空检查的游标索引越界异常,java,android,sqlite,Java,Android,Sqlite,我在这里查了一大堆问题,找不到正确答案。我在从数据库检索数据时遇到问题。我得到android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为0exception。我创建数据库的代码: String KREIRAJ_TABELU = "CREATE TABLE " + IME_TABELE + "(" + ID + " INTEGER PRIMARY KEY," + PITANJE + " TEXT," + PRVI_N
String KREIRAJ_TABELU = "CREATE TABLE " + IME_TABELE + "("
+ ID + " INTEGER PRIMARY KEY," + PITANJE + " TEXT,"
+ PRVI_NETACAN + " TEXT," + DRUGI_NETACAN + " TEXT," + TRECI_NETACAN + " TEXT," + TACAN_ODGOVOR + " TEXT" + ")";
db.execSQL(KREIRAJ_TABELU);
String dodajPitanjaIOdgovore = "INSERT INTO pitanja (ID,PITANJE,PRVI_NETACAN,DRUGI_NETACAN,TRECI_NETACAN,TACAN_ODGOVOR)\n" +
"VALUES (0,\"Ovo je prvo pitanje:\",\"Netacan odgovor\",\"Netacan odgovor\",\"Netacan odgovor\",\"Tacan odgovor\");\n" +
"\n" + ...
db.execSQL(dodajPitanjaIOdgovore);
对于检索数据,我使用以下代码:
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(IME_TABELE, new String[]{ID,
PITANJE, PRVI_NETACAN, DRUGI_NETACAN, TRECI_NETACAN, TACAN_ODGOVOR}, ID + "=?",
new String[]{String.valueOf(id)}, null, null, null, null);
if(cursor.getCount() > 0)
{
cursor.moveToFirst();
}
podaciOPitanjima podaci = new podaciOPitanjima(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));
return podaci;
编辑:我也试过这个:
if (cursor.moveToFirst()) {
podaciOPitanjima podaci = new podaciOPitanjima(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));
}
else{
podaciOPitanjima podaci;
}
podaciOPitanjima podaci = new podaciOPitanjima(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getString(4), cursor.getString(5));
return podaci;
改变
if (cursor.getCount() > 0) {
cursor.moveToFirst();
}
//do operations here
到
说明-问题在于这一行:
使用cursor.getString
时,光标实际上不在一行上(因为没有行),因此无法获取此命令所要求的单元格/列
完整解决方案:
现在请记住,无论您在何处调用此方法,都可能会返回
null
,您需要检查它。尝试使用Try catch block..if(cursor.getCount()>0)
如果此条件为false,您认为会发生什么情况?我用尝试过的代码编辑了我的帖子,但它仍然不起作用。我只是请求了索引0-1@Slay29您的编辑仍然不正确,如果光标中没有任何内容,您仍然可以访问它。如果cursor.moveToFirst()
为false,则应返回null
或其他内容,因为光标中没有任何内容。如果cursor.moveToFirst()
为真,那么返回podaci
哦,我明白你的意思了!美好的非常感谢你!我当时觉得有点傻,因为我没有充分考虑这一点!再次感谢你!
if (cursor.moveToFirst()) {
//do operations here
}
podaci = new poda...ima(Integer.parseInt(cursor.getString(0)), ...);
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(IME_TABELE, new String[]{ID, PITANJE, PRVI_NETACAN, DRUGI_NETACAN, TRECI_NETACAN, TACAN_ODGOVOR}, ID + "=?", new String[]{String.valueOf(id)}, null, null, null, null);
podaciOPitanjima podaci = null;
if (cursor.moveToFirst()) {
//Note: using getColumnIndex avoids errors if the columns are ever returned in a changed order
podaci = new podaciOPitanjima(
cursor.getInteger( cursor.getColumnIndex(ID) ),
cursor.getString( cursor.getColumnIndex(PITANJE) ),
cursor.getString( cursor.getColumnIndex(PRVI_NETACAN) ),
cursor.getString( cursor.getColumnIndex(DRUGI_NETACAN) ),
cursor.getString( cursor.getColumnIndex(TRECI_NETACAN) ),
cursor.getString( cursor.getColumnIndex(TACAN_ODGOVOR) ));
}
return podaci;