2011-07-21 11 views
6

Tengo una aplicación que funciona bien en Android 2.1, pero cuando trato de hacer la transición a la 3.0 obtengo un error del cursor que no me resulta familiar.Android 3.0 No se pudo leer la fila #, columna # de la ventana del cursor

java.lang.IllegalStateException: No se pudo leer row0, la columna de -1 ventana del cursor. Asegúrese de que el cursor se inicialice correctamente antes de accediendo a los datos desde él.

Todos los datos se almacenan en una base de datos SQLite y este código funciona bien en Android 2.1. ¿Tiene que inicializarse un cursor de manera diferente en Android 3.0?

A continuación se muestra mi código.

private void OpenGroupData(){ 
SQLiteDatabase db = openOrCreateDatabase(DATABASE_NAME,Context.MODE_PRIVATE,null); 
Cursor cur = db.rawQuery("SELECT groupid FROM properties GROUP BY GroupID" + ";" , null); 
LinearLayout glayout = (LinearLayout) findViewById(R.id.Grouplayout); 
LinearLayout gwindow = (LinearLayout) findViewById(R.id.groupwindow); 

TextView data = new TextView(this); 
glayout.addView(data); 
data.setText(""); 
int ID = cur.getColumnIndex("groupid"); 
int idvalue; 

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_USER); 

try{ 
    // Check if our result was valid. 
    cur.moveToFirst(); 
    if (cur != null) { 

     // Loop through all Results 
     do {data = new TextView(this); 
      data.setTextSize(20); 
     data.setClickable(true); 
     data.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       GroupClick(v); 
      } 
      }); 
     glayout.addView(data); 
     idvalue = cur.getInt(ID); 
     data.setId(idvalue); 
     data.setText("Group: " + idvalue); 
     }while(cur.moveToNext()); 
     } 
     cur.close(); 
     db.close(); 
     } catch(Exception e) { 
      Toast.makeText(getApplicationContext(), "Open Group Exception: " + e.toString(), Toast.LENGTH_SHORT).show(); 
     } 
} 

Respuesta

1

Alright I found it. Por algún motivo, cuando trato de transitar mi aplicación a 3.0 cuando mi cursor se mueve y obtiene el índice de columna para un campo, en este caso ("groupid") devuelve un valor de -1. Cuando el Cursor intenta comenzar en -1 se bloquea porque no puede encontrar un registro en la fila (0), columna (-1). Así que mi solución fue simplemente agregar uno al índice de la columna al obtener la identificación. vea abajo.

int ID = cur.getColumnIndex("groupid") + 1; 
int idvalue; 

Al agregar 1 al índice de columna, parece que se ha resuelto el problema.

+0

Tuve exactamente el mismo problema y esto lo solucionó, ¡gracias! +1 – Matt

2

Me encontré con el mismo mensaje de error a principios de este día. Todo resultó que hice un error tipográfico en el nombre de la columna. Por lo tanto, si todavía se aplica, podría ir y verificar el nombre de la columna para detectar errores de escritura. Tenga en cuenta que también es sensible a mayúsculas y minúsculas. De error para mí fue a lo largo de las líneas de:

//Trew error 
c.getColumnIndex("ArticleNumber"); 

//Was correct 
c.getColumnIndex("Articlenumber"); 
+1

Puede intentar usar la cadena final pública estática ARTICLE_NUMBER = "articleNumber" y siempre apuntar a ese valor. Entonces, si tiene una clase llamada DBConstants, haga algo como esto: c.getColumnIndex (DBConstants.ARTICLE_NUMBER). De esta forma nunca recibirás errores tipográficos :) – DecodeGnome

1

Si getColumnIndex devuelve -1, a continuación, la columna no existe. Otherwize devuelve el índice de columnas de base cero.

+0

sí, es correcto. mi nombre de columna es "nombre" pero se accede como getColumnIndex ("Nombre"). después de cambiar el nombre por el nombre, funcionó – Senthil

1

-1 es la columna _id que cada tabla sqlite debe tener como es requerido por el framework android. Si tiene que agregar +1 al índice, se equivoca en alguna parte.

0

El valor -1 devuelve getColumnIndex (columnName) si no se puede encontrar 'columnName'. Compruebe los nombres de columna

Cuestiones relacionadas