Quiero obtener datos de una tabla SQLite y sé que esa tabla siempre tendrá un solo registro. Estoy tratando de hacer eso usando:

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;
}

Pero siempre obtengo:

'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'.

La única forma en que puedo acceder a esta información es devolviendo una matriz de Tokens y haciendo .get (0), pero siento que no es la forma correcta, ya que no tiene sentido devolver una matriz de un solo objeto.

0
Nelson Silva 20 ene. 2018 a las 01:58

3 respuestas

La mejor respuesta

El índice del cursor comienza fuera de los límites. Debe usar Cursor#moveToFirst() que mueve el cursor al índice 0 y devuelve true si hay elementos en el cursor.

Así que algo como esto:

if (cursor.moveToFirst()) {
   // Cursor has items and is ready for extraction
} else {
   // Cursor has no items.
}
1
DeeV 19 ene. 2018 a las 23:02

No se está moviendo a una posición dentro del cursor, por lo tanto, la ubicación es anterior a cualquier fila, es decir, -1.

Debe moverse a una fila y, en su caso, desea la primera fila ( no es que haya (es decir, el mensaje dice tamaño de 0 )) y solo si se puede realizar el movimiento, ¿desea extraer datos? De lo contrario, no manejaría datos disponibles.

Los métodos del Cursor move???? (moveToFirst, moveToLast, moveToNext, moveToPrevious, moveToPosition) devuelven verdadero si se puede hacer el movimiento, de lo contrario falso.

Entonces su código sea: -

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;

Como nota, no es aconsejable usar desplazamientos de columna en general, sino que la forma más común es obtener el desplazamiento de acuerdo con el nombre de la columna usando getColumnIndex(column_name). Entonces (suponiendo que el nombre de la columna es id ) sería reemplazar cursor.getLong(0) con cursor.getLong(cursor.getColumnIndex("id")

1
MikeT 19 ene. 2018 a las 23:37

Debe mover cursor en la primera fila antes de poder obtener datos de ella. Llame al método moveToNext antes de acceder a los datos de cursor

while(cursor.MoveToNext()) {
    User_Token auxUserToken = new User_Token(
        cursor.getLong(0),
        cursor.getString(1),
        cursor.getString(2),
        cursor.getString(3));
} 
1
Yousaf 19 ene. 2018 a las 23:02