Cómo probar si el cursor está vacío en una consulta SQLiteDatabase

Tengo una tabla del SQL que se crea con el código siguiente:

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

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 que tengo que iniciar una actividad A si el cursor está vacío (es decir, la tabla no almacena valores) 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 intentado usar Log como sigue:

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

Pero el registro muestra 1, si la tabla está vacía … y de nuevo 1, si la tabla tiene 1 entrada …. muestra 2, si la tabla tiene dos entradas y así sucesivamente.

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

¿Qué hay de probar el cursor como este, y luego hacer lo que ha 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 ()

La manera más fácil y más limpia de probar un cursor vacío es el código siguiente:

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

Por los documentos, el método devuelve false si el cursor está vacío:

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

Público resumen booleano moveToFirst ()

Añadido en el nivel de API 1 Mueva el cursor a la primera fila.

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

Devuelve si el movimiento se ha realizado correctamente.

Los registros eliminados permanecen en SQLite como registros nulos, pero getCount() cuenta sólo los registros nulos. Si su tabla tiene algunos registros que son nulos, algunos de los registros no nulos tendrán _Id número _Id mayor que el resultado de getCount() . Para llegar a ellos, puede iterar el cursor (utilizando el bucle for () el doble de veces que el resultado de getCount() y usar el cursor para llenar 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() .

Recuerda:

  1. getCount() devuelve el número de registros no nulos,
  2. Cursor devuelve _Id números de registros no nulos,
  3. _Id números "perdido" por el cursor son _Id números de registros nulos,
  4. Debe llegar lo suficientemente más allá de getCount() para obtener todos ellos.

Sólo tienes que usar getCount (). Si su sql es correcto pero no devuelve ninguna fila tendrá un objeto de cursor NOT null pero sin las filas y getCount () devolverá 0.

Mi sugerencia sería usar ListActivity .

Esas son actividades que están destinadas a mostrar elementos en un ListView . Simplemente puede utilizar un SimpleCursorAdapter para rellenarlos (también ilustrado en la página ListActivity ).

También ofrecen un método setEmptyView() , que se puede utilizar para mostrar una View (puede ser un TextView ) que informa al usuario que aún no hay registros y cómo puede crear uno.

Un ejemplo de cómo hacerlo se puede encontrar aquí .

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

Debe utilizar la consulta SQLiteDatabase.

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

A continuación, puede utilizar c.getCount () para determinar si la tabla tiene algo.

  • Cómo guardar imágenes en la base de datos
  • Accede a la base de datos sqlite de Android desde el PC de desarrollo
  • Cómo comprobar si BLOB es nulo
  • Android - SQLite ContentResolver insertar / eliminar / actualizar en UI Thread?
  • Intel XDK: Conexión de la aplicación móvil a una base de datos
  • Cómo cargar más de 1 MB de datos desde sqlite db al cursor de Android?
  • Android sqlite - selecciona registros donde el campo es nulo o vacío
  • Mostrar datos SQLite en RecyclerView
  • SQLite lectura y escritura simultánea
  • Android permiso de creación de base de datos
  • Evento de clic de AutoCompleteTextView en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.