Conseguir cursorindexoutofboundsexception
-
12-12-2019 - |
Pregunta
Tengo una función para leer los datos de DB.Phut, este sigue Siempre devuelve el error ... no tengo mucho conocimiento en Android ... Sooking para obtener ayuda
10-03 11:33:05.870: E/AndroidRuntime(1321): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.projects.myworldsafe/com.projects.myworldsafe.DeailedView}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
.
String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);
c.moveToFirst();
int index= c.getCount();
int indexd= c.getColumnIndex(ITEM_CONTENT);
System.out.print("Count query"+indexd);
return c.getString(index);
}
Solución
Usa esto:
return c.getString(indexd);
Es lo que realmente quieres obtener valor.Usted usó index
allí, que devuelve el número de registro en su cursor.
También es mejor práctica:
String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);
if(c.getCount()>0){
c.moveToFirst();
int index= c.getCount();
int indexd= c.getColumnIndex(ITEM_CONTENT);
System.out.print("Count query"+index);// use index instead of indexd to print total records in query
return c.getString(index);// return value of column number specified in indexd
}
else
return "";// when no records found
}
Otros consejos
Aquí está el código correcto
int index= c.getCount(); // this will return total rows found
int indexd= c.getColumnIndex(ITEM_CONTENT); // this is the column index by giving the column name.
System.out.print("Count query"+indexd);
return c.getString(indexd); // here you need to pass the column index but you passing the index which was total number of rows
Cursor c=db.rawQuery(selectQuery,params);
está devolviendo el cursor con el tamaño 0, cambie su código para verificar si el cursor tiene elementos o no, luego muévase a la primera posición por:
Cursor c=db.rawQuery(selectQuery,params);
if(c.getCount()>0)
{
c.moveToFirst();
int index= c.getCount();
int indexd= c.getColumnIndex(ITEM_CONTENT);
System.out.print("Count query"+indexd);
return c.getString(index);
}
return "";
Suena como si estuvieras tratando de leer desde un resultado vacío.
Revise su base de datos, la consulta está devolviendo un cursor de tamaño 0, por lo que está intentando acceder al cursor en el índice 0, de ahí el error. Repensar la consulta y verificar la base de datos para valores.
Probablemente está accediendo a un cursor de 0 filas.CAMBIAR A:
// moveToFirst itself will return false if there is no entry on Cursor
if(c.moveToFirst()){
int cursorCount = c.getCount();
int indexd = c.getColumnIndex(ITEM_CONTENT);
System.out.print("Count query"+index);
// You should getString(ColumnIndex) not CursorCount
return c.getString(indexd);
} else
return "";
Está obteniendo una excepción de índice fuera de los límites, ya que está pasando el número de registros en lugar del número de columna. Como mejores prácticas de codificación, consulte el cursor para registros, es decir, está vacío o contiene registros. Usa esto
String getItemDetailsWp(String id){
System.out.print(id);
SQLiteDatabase db = this.getReadableDatabase();
String[] params=new String[]{id};
String selectQuery = "SELECT Content FROM " + TABLE_ITEMS +" WHERE "+ITEM_ID+"=?";
Cursor c=db.rawQuery(selectQuery,params);
if(c.getCount()>0){
c.moveToFirst();
int index= c.getCount();
int indexd= c.getColumnIndex(ITEM_CONTENT);
System.out.print("Count query"+index);
return c.getString(indexd);
}
else
return "";// when no records found
}