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:
- Transacción de la base de datos Android
- Sincronizar las bases de datos sqlite con mysql
- Acceso a los datos principales de iOS desde Android
- ¿Cómo puede obtener la parte superior de los registros de GreenDAO?
- OrmLite SQLiteException: ninguna tabla
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.
- Sqlite restricción error código de error
- Cómo utilizar FTS3 en SQLite
- Android: ListView con CheckBox, poblado desde la base de datos SQLite no funciona
- Conversión de String en DateTime: Android
- Copia de seguridad y restauración de la base de datos SQLite a sdcard
- ¿Cómo utilizar correctamente TextSwitcher en ListView?
- El incremento automático de SQLite no funciona
- Orden de consulta de SQlite por caso
¿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:
-
getCount()
devuelve el número de registros no nulos, - Cursor devuelve
_Id
números de registros no nulos, -
_Id
números "perdido" por el cursor son_Id
números de registros nulos, - 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.
- Impedir que la imagen de fondo se estire la vista
- Cómo cancelar una compra de prueba en la aplicación en android?