SQLite get上的CursorIndexOutOfBoundsException

时间:2018-01-19 22:58:08

标签: android sqlite

我想从SQLite表中获取数据,我知道该表总是只有一条记录。我正试着这样做:

public User_Token getUser_TokenDB() {

    String sql = "SELECT * FROM " + TABLE_NAME_USER_TOKEN  +" WHERE ID = " + 1;

    Cursor cursor = this.database.rawQuery(sql, null);

User_Token auxUserToken = new User_Token(
        cursor.getLong(0),
        cursor.getString(1),
        cursor.getString(2),
        cursor.getString(3));

return auxUserToken;
}

但我总是得到:

'java.lang.RuntimeException: Unable to start activity ComponentInfo{com.support.android.iplfit/com.support.android.iplfit.Activities.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0'.

我可以访问此信息的唯一方法是返回一个Tokens数组并执行.get(0),但我觉得这不是正确的方法,因为返回一个只有一个对象的数组是没有意义的。

3 个答案:

答案 0 :(得分:1)

游标索引超出范围。您需要使用Cursor#moveToFirst()将光标移动到0索引,如果光标中有项目,则返回true

这样的事情:

if (cursor.moveToFirst()) {
   // Cursor has items and is ready for extraction
} else {
   // Cursor has no items.
}

答案 1 :(得分:1)

您需要在第一行移动cursor,然后才能从中获取数据。在访问moveToNext

中的数据之前,请先调用cursor方法
while(cursor.MoveToNext()) {
    User_Token auxUserToken = new User_Token(
        cursor.getLong(0),
        cursor.getString(1),
        cursor.getString(2),
        cursor.getString(3));
} 

答案 2 :(得分:1)

移动到光标内的位置,因此位置在任何行之前,即-1。

您需要移动到一行,在您的情况下,您需要第一行(不是有任何 (即消息显示 大小为0 ))并且只有在可以进行移动时才需要提取数据。否则你将无法处理任何数据。

光标move????方法(moveToFirstmoveToLastmoveToNextmoveToPreviousmoveToPosition)如果移动可以返回true做了,否则是假的。

所以你的代码是: -

Cursor cursor = this.database.rawQuery(sql, null);
if (cursor.moveToFirst) {

    User_Token auxUserToken = new User_Token(
    cursor.getLong(0),
    cursor.getString(1),
    cursor.getString(2),
    cursor.getString(3));
} else {
  return null; //???? handle no data how you want perhaps null.
}
return auxUserToken;

作为注释,通常使用列偏移是不可取的,而更常见的方法是使用getColumnIndex(column_name)根据列名获取偏移量。因此(假设列名称为 id )将cursor.getLong(0)替换为cursor.getLong(cursor.getColumnIndex("id")