2012-06-29 24 views
6

Estoy tratando de obtener un texto de una determinada fila de mi base de datos. Para ello, he hecho esta funciónCursorIndexOutOfBoundsException Índice 0 solicitado, con un tamaño de 0

public String getTranslation(long rowId) throws SQLException {  
    String str = null; 
    Cursor mCursor = db.query(
     true, TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK 
     }, 
     KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, null, null 
    ); 

    if (mCursor != null) { 
     mCursor.moveToFirst(); 
     str = mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME)); 
    } 
    return str; 
} 

y yo lo llamo así:

db = new DbAdapter(this); 
db.createDatabase(); 
db.openDataBase(); 
String str = db.getTranslation(1706); 

Mi mesa se ve así:

enter image description here

me sale este error:

09:32:08.965 307 com.Orange ERROR AndroidRuntime Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:580) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:214) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:41) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at com.Orange.Database.DbAdapter.getTranslation(DbAdapter.java:141) 
09:32:08.965 307 com.Orange ERROR AndroidRuntime  at com.Orange.Authentication.onCreate(Authentication.java:32) 

¿Por qué recibo este error? ¿Qué estoy haciendo mal aquí?

Gracias de antemano.

+0

Acepte amablemente la respuesta si tiene su solución :) –

Respuesta

25

Parece que tienes un cursor emtpy. En lugar de comprobar si se trata intento nulo checkcing

if(mCursor.getCount() > 0) 
{ 
    //do stuff 
} 

tratar de retirar a su condición en la que para asegurarse de que en realidad obtener los datos cuando se ejecuta la instrucción de selección. Si aún no obtienes nada, es posible que tengas un error ortográfico en los nombres de las tablas o que no puedas conectar/crear la base de datos/tablas.

Cursor mCursor = db.query("sys_interface_text", new String[] { 
     "id_interface_text", "item_name","form_label_id", "form_rank"}, 
       "form_label_id = 1706", null, null, null, 
     null); 
+0

Puse esta condición y veo que el recuento de mi cursor es 0, pero no entiendo por qué. – Gabrielle

+0

Lee la respuesta de Khan, tu db. la consulta no coincide con la sintaxis descrita en http://developer.android.com/reference/android/database/sqlite/SQLiteQueryBuilder.html eliminar "verdadero" de los parámetros podría hacer el truco – KristianMedK

+0

Cambié mi consulta como dijo Khan , pero sigue siendo el mismo problema. – Gabrielle

0

intento por cambiar esta línea

Cursor mCursor = db.query(true, TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
        KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, 
      null, null); 

por

Cursor mCursor = db.query(TABLE_LANGUAGE_FR, new String[] { 
      KEY_ID_INTERFACE_TEXT, KEY_ITEM_NAME,KEY_FORM_LABEL_ID, KEY_FORM_RANK}, 
        KEY_FORM_LABEL_ID + "=" + rowId, null, null, null, 
      null); 

y también agregue esto si la condición

return str; 
+0

Tengo el mismo error, nada cambió. – Gabrielle

+0

uno más compruebe su nombre de columna y nombre de tabla debe ser el mismo que en la base de datos que no tiene ningún error de ortografía también esto puede causar el problema – Khan

+0

qué tipo de columna KEY_FORM_LABEL_ID es – Khan

1

Trate de usar

while(cursor.moveToNext()) 
{ 
    if(cursor.isFirst()) 
    { 
     //Your code goes here in your case 
     return mCursor.getString(mCursor.getColumnIndex(KEY_ITEM_NAME)); 
    } 
} 
finaly 
{ 
if(mCursor!= null) 
{ 
    mCursor.close(); 
} 
} 
Cuestiones relacionadas