2011-08-28 43 views
22

Tengo una tabla de SQL que se crea mediante el siguiente código:Cómo probar si el cursor está vacía en una consulta SQLiteDatabase

public void onCreate(SQLiteDatabase db) { 
    db.execSQL("CREATE TABLE " + TABLE_NAME + " (" + _ID 
     + " INTEGER PRIMARY KEY AUTOINCREMENT, " + SUBJECT 
     + " TEXT NOT NULL," + TOPIC + " TEXT NOT NULL, " 
     + LECTURENUMBER + " TEXT NOT NULL, " + PAGENUMBER 
     + " TEXT NOT NULL, " + DATE + " TEXT NOT NULL, " + _DATA 
     + " TEXT NOT NULL);"); 
} 

que consultar la tabla de la siguiente manera:

String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
    + " GROUP BY " + SUBJECT + ";"; 

Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

El problema es necesario iniciar una Actividad A si el cursor está vacío (es decir, la tabla no almacena ningún valor) y la Actividad B si el cursor no está vacío (es decir, la tabla está llena).

No puedo encontrar un método que pueda decirme si la tabla está vacía o no. he tratado de ocasión: Sierra de la siguiente manera:

private void showSubjectsOnList() { 
    String sql = "SELECT " + _ID + "," + SUBJECT + " FROM " + TABLE_NAME 
     + " GROUP BY " + SUBJECT + ";"; 

    Cursor cursor = subjects.getReadableDatabase().rawQuery(sql, null); 

    Log.d("Events",Integer.toString(cursor.getCount())); 
    if(cursor.isNull(0)!=false){ 
     cursor.close(); 
     subjects.close(); 
     startActivity(new Intent(this,OpenScreen.class)); 
    } 
} 

Sin embargo, el registro muestra 1, si la tabla está vacía ... y otra vez 1, si la tabla tiene 1 entrada .... se nota 2, si la tabla tiene dos entradas, etc.

¿Puede sugerir algún método para resolver mi problema de iniciar diferentes actividades en función de si el cursor está vacío o no?

Respuesta

55

¿Qué pasa con el cursor prueba como esta, y luego hacer lo que has dicho:

if(cursor!=null && cursor.getCount()>0) 

getCount()

Devuelve el número de filas en el cursor

http://developer.android.com/reference/android/database/Cursor.html#getCount()

+0

No he probado exactamente la forma en que usted lo mencionó. Pero he intentado usar cursor = null , así, de la siguiente manera:! Log.d (! "Eventos", Boolean.toString (cursor = null)); Lo interesante es que Log se muestra verdadero si la tabla tiene algunos valores, pero sorprendentemente el registro no se muestra en absoluto si la tabla está vacía. Estoy confundido, ¿qué significa eso? –

+0

No olvide mover el puntero del cursor al primer registro con 'cursor.moveToFirst()' antes de probar –

+0

Significa que su consulta arroja cero filas. Lo que significa que el cursor no es nulo, pero tiene cero filas: D –

22

La más fácil y limpia forma nido para la prueba de un cursor vacío es el siguiente código:

if (cursor.moveToFirst()) { 
    // start activity a 
} else { 
    // start activity b 
} 

por la documentación, el método devuelve false si el cursor está vacía:

http://developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29

abstract boolean pública moveToFirst ()

Agregado en el nivel de API 1 Mueva el cursor a la primera fila.

Este método devolverá falso si el cursor está vacío.

Devuelve si el movimiento tuvo éxito.

+0

Probado, pero no funciona: s –

+0

¿Qué pasa con cursor.moveToNext() ... Creo que este será verdadero? si hay filas y falso si no se encontró una fila ... –

+0

@KarueBensonKarue - también puede. Eche un vistazo a los documentos. – SBerg413

0

Mi sugerencia sería usar un ListActivity.

Esas son las actividades que están destinadas a mostrar elementos en un ListView. Simplemente puede usar un SimpleCursorAdapter para poblarlos (también se ilustra en la página JavaDoc de ListActivity).

También ofrecen una setEmptyView()-method, que se puede utilizar para mostrar un View (que podría ser un TextView) que informa al usuario de que no hay registros todavía y cómo se puede crear una.

Se puede encontrar un ejemplo de cómo hacerlo here.

+0

Querido Lukas Knuth, –

+1

... ¿y el resto? –

+0

Estimado Lukas, La actividad B es realmente la actividad de lista. Incluso el método showSubjectsOnList() mencionado anteriormente es un método en esta actividad. Si el cursor en ShowSubjectsOnList está vacío, quiero iniciar la Actividad A, de lo contrario quiero permanecer en la misma actividad ..... Pero no puedo encontrar cómo encontrar que el cursor está vacío. –

1

Solo necesita usar getCount(). Si su sql es correcto pero no devuelve ninguna fila, tendrá un objeto de cursor NOT nulo pero sin filas y getCount() devolverá 0.

+0

Por favor, elabore. –

+0

El objeto del cursor siempre se devuelve cuando consulta su base de datos. Tiene su cadena de consulta dentro, por ejemplo. Por lo tanto, no puede ser nulo: en Java, el identificador que no está "conectado" a ningún objeto es nulo. Solo si su consulta de selección no devolvió ninguna fila, getCount() devolverá cero. – Minolan

+0

Hmm..ok ... Gracias por su elaboración. ¿Pero cómo puedo resolver mi problema entonces? –

0

Creo que su problema es que no está creando una consulta adecuada .

Debe usar la consulta SQLiteDatabase.

Cursor c = db.query(TABLE_NAME, null, 
      null, null, null, null, null); 

Luego puede usar c.getCount() para determinar si la tabla tiene algo.

2

Los registros eliminados permanecen en SQLite como registros nulos, pero getCount() cuenta solo registros no nulos. Si su tabla tiene algunos registros que son nulos, algunos de los registros no nulos tendrán números _Id más grandes que el resultado de getCount(). Para llegar a ellos, puede iterar el cursor (usando for() loop) el doble de veces que el resultado de getCount() y usar el cursor para completar los números de record_Id en una matriz. Digamos que la matriz resultante es { 1, 2, 5, 6, 7, 8, 9, 11, 12, 14 }.

Eso significa que los registros 3, 4, 10, 13 son registros nulos y su tabla tiene 14 registros todos juntos, no 10 que obtuvo de getCount().

Recuerde:

  1. getCount() rendimientos número de no registros nulos,
  2. cursor vuelve _Id número de no registros nulos,
  3. _Id números "perdidas" por el cursor son _Id número de registros nulos,
  4. debe llegar a más de getCount() para obtenerlos todos.
Cuestiones relacionadas