tabla - rawquery android example
¿Cómo obtener el recuento de filas en sqlite con Android? (9)
Estoy creando el administrador de tareas. Tengo una lista de tareas y quiero cuando hago clic en el nombre de la lista de tareas concreta si está vacía, luego continúa la actividad Agregar tarea, pero si tiene 2 o 3 tareas, entonces me muestra esas tareas en forma de lista.
Estoy tratando de contar en la lista. mi consulta de base de datos es como:
public Cursor getTaskCount(long tasklist_Id) {
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) });
if(cursor!=null && cursor.getCount()!=0)
cursor.moveToNext();
return cursor;
}
En Mi actividad:
list_tasklistname.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0,
android.view.View v, int position, long id) {
db = new TodoTask_Database(getApplicationContext());
Cursor c = db.getTaskCount(id);
System.out.println(c.getCount());
if(c.getCount()>0) {
System.out.println(c);
Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
task = adapter.getItem(position);
int taskList_id = task.getTaskListId();
taskListID.putExtra("TaskList_ID", taskList_id);
startActivity(taskListID);
}
else {
Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
startActivity(addTask);
}
}
});
db.close();
}
pero cuando hago clic en el nombre de la lista de tareas, devuelve 1, número de tareas dentro del mismo.
¿Ves lo que hace DatabaseUtils.queryNumEntries () ? ¡Es horrible! Yo uso esto.
public int getRowNumberByArgs(Object... args) {
String where = compileWhere(args);
String raw = String.format("SELECT count(*) FROM %s WHERE %s;", TABLE_NAME, where);
Cursor c = getWriteableDatabase().rawQuery(raw, null);
try {
return (c.moveToFirst()) ? c.getInt(0) : 0;
} finally {
c.close();
}
}
Cambia tu método getTaskCount a esto:
public int getTaskCount(long tasklist_id){
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor= db.rawQuery("SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?", new String[] { String.valueOf(tasklist_id) });
cursor.moveToFirst();
int count= cursor.getInt(0);
cursor.close();
return count;
}
A continuación, actualice el controlador de clics en consecuencia:
public void onItemClick(AdapterView<?> arg0, android.view.View v, int position, long id) {
db = new TodoTask_Database(getApplicationContext());
// Get task list id
int tasklistid = adapter.getItem(position).getTaskListId();
if(db.getTaskCount(tasklistid) > 0) {
System.out.println(c);
Intent taskListID = new Intent(getApplicationContext(), AddTask_List.class);
taskListID.putExtra("TaskList_ID", tasklistid);
startActivity(taskListID);
} else {
Intent addTask = new Intent(getApplicationContext(), Add_Task.class);
startActivity(addTask);
}
}
Para consultar una tabla para el número de filas en esa tabla, desea que su consulta sea lo más eficiente posible. Reference .
Usa algo como esto:
/**
* Query the Number of Entries in a Sqlite Table
* */
public long QueryNumEntries()
{
SQLiteDatabase db = this.getReadableDatabase();
return DatabaseUtils.queryNumEntries(db, "table_name");
}
Sé que ha sido respondido hace mucho tiempo, pero me gustaría compartir esto también:
Este código funciona muy bien:
SQLiteDatabase db = this.getReadableDatabase();
long taskCount = DatabaseUtils.queryNumEntries(db, TABLE_TODOTASK);
PERO, ¿y si no quiero contar todas las filas y tengo una condición para postularme?
DatabaseUtils tiene otra función para esto: DatabaseUtils.longForQuery
long taskCount = DatabaseUtils.longForQuery(db, "SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) });
La documentación de longForQuery
dice:
Método de utilidad para ejecutar la consulta en el archivo db y devolver el valor en la primera columna de la primera fila.
public static long longForQuery(SQLiteDatabase db, String query, String[] selectionArgs)
Es fácil de usar y le ahorrará tiempo y un código repetitivo
Espero que esto ayude a alguien algún día :)
Soy un codificador perezoso, y no entiendo todos los métodos adicionales, creación de cursor, concatenación de cadenas, búsqueda de variables, etc. a menos que sea beneficioso.
Si todo lo que quiero es un conteo rápido de filas:
if ((db.rawQuery("SELECT column FROM table", null).getCount()) > 0) {
// Do stuff
}
¡Encuentro que las cadenas simples son más fáciles de leer! No me malinterpreten. Sí código de una manera más detallada cuando es necesario, pero si puedo hacerlo una línea, lo haré.
Saludos,
Jacko
EDITAR:
Acabo de mirar la fecha, es probable que haya ordenado esto ahora /
Una vez que obtienes el cursor, puedes hacer
Cursor.getCount ()
Usando DatabaseUtils.queryNumEntries()
:
public long getProfilesCount() {
SQLiteDatabase db = this.getReadableDatabase();
long count = DatabaseUtils.queryNumEntries(db, TABLE_NAME);
db.close();
return count;
}
o ( más ineficientemente )
public int getProfilesCount() {
String countQuery = "SELECT * FROM " + TABLE_NAME;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
int count = cursor.getCount();
cursor.close();
return count;
}
En actividad:
int profile_counts = db.getProfilesCount();
db.close();
Use android.database.DatabaseUtils para obtener el número de conteo.
public long getTaskCount(long tasklist_Id) {
return DatabaseUtils.queryNumEntries(readableDatabase, TABLE_NAME);
}
Es una herramienta fácil de usar que tiene múltiples métodos de contenedor para lograr las operaciones de la base de datos.
c.getCount()
devuelve 1
porque el cursor contiene una sola fila (la que tiene el COUNT(*)
real COUNT(*)
). El recuento que necesita es el valor int
de la primera fila en el cursor.
public int getTaskCount(long tasklist_Id) {
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor= db.rawQuery(
"SELECT COUNT (*) FROM " + TABLE_TODOTASK + " WHERE " + KEY_TASK_TASKLISTID + "=?",
new String[] { String.valueOf(tasklist_Id) }
);
int count = 0;
if(null != cursor)
if(cursor.getCount() > 0){
cursor.moveToFirst();
count = cursor.getInt(0);
}
cursor.close();
}
db.close();
return count;
}