Consulta SQLite en Android para contar filas

91

Estoy tratando de crear un formulario de inicio de sesión simple, donde comparo el ID de inicio de sesión y la contraseña ingresados ​​en la pantalla de inicio de sesión con los almacenados en la base de datos.

Estoy usando la siguiente consulta:

final String DATABASE_COMPARE =
"select count(*) from users where uname=" + loginname + "and pwd=" + loginpass + ");" ;

El problema es, no sé, cómo puedo ejecutar la consulta anterior y almacenar el recuento devuelto.

Así es como se ve la tabla de la base de datos (me las arreglé para crear la base de datos con éxito usando el método execSQl)

private static final String
DATABASE_CREATE =
            "create table users (_id integer autoincrement, "
            + "name text not null, uname primary key text not null, " 
            + "pwd text not null);";//+"phoneno text not null);";

¿Puede alguien guiarme amablemente sobre cómo puedo lograr esto? Si es posible, proporcione un fragmento de muestra para realizar la tarea anterior.

arun
fuente

Respuestas:

121

DatabaseUtils.queryNumEntries (desde api: 11) es una alternativa útil que niega la necesidad de SQL sin formato (¡yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
scottyab
fuente
para OS <11, obtiene el error NoSuchMethodError, ¿hay alguna solución alternativa para admitir OS <11?
Khobaib
2
@Khobaib Comprueba la respuesta de ghchinoy
Eduardo Herzer
1
@EduardoHerzer Encontré una forma con cursor.getCount () directamente.
Khobaib
1
@Khobaib Esa no es una forma muy eficiente de hacerlo. Siempre debe preferir usar SELECT COUNT(*)y queryNumEntries()recuperar todos los registros y ver cuántos hay, es decir. cursor.getCount()
DearVolt
114

@scottyab, el DatabaseUtils.queryNumEntries (db, table, whereparams) parametrizado existe en API 11 +, el que no tiene whereparams existe desde API 1 . La respuesta debería ser la creación de un Cursor con un db.rawQuery:

Cursor mCount= db.rawQuery("select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass +"'", null);
mCount.moveToFirst();
int count= mCount.getInt(0);
mCount.close();

También me gusta la respuesta de @ Dre, con la consulta parametrizada.

ghchinoy
fuente
1
Para aquellos que se preguntan, el parámetro de mCount.getInt()es columnindex. ¡Gracias por la ayuda!
T.Woody
62

Utilice un SQLiteStatement .

p.ej

 SQLiteStatement s = mDb.compileStatement( "select count(*) from users where uname='" + loginname + "' and pwd='" + loginpass + "'; " );

  long count = s.simpleQueryForLong();
Teknogrebo
fuente
1
Una cosa que me gusta de esta respuesta frente a la respuesta de @ scottyab (que también ES realmente buena) es que puede especificar una cláusula LIMIT en este caso. Esto es útil cuando solo desea saber si hay ALGUNA fila en una tabla (por ejemplo, seleccione (contar (*)> 0) de TABLE LIMIT 1) frente a ninguna fila. Supongo que será más rápido cuando la tabla no tenga filas o tenga un montón de filas. Este es el caso específico que tuve al buscar esto ...
atascadoj
@Teknogrebo: Esta es una buena respuesta, aunque usaría la versión parametrizada. Puede usar ?s en la consulta y luego usar bindString(int, String)y bindLong(int, long)para insertar los valores. Vea aquí .
DearVolt
22

Consulte rawQuery (String, String []) y la documentación de Cursor

Su declaración SQL DADABASE_COMPARE no es válida actualmente loginnamey loginpassno se escapará, no hay espacio entre loginnamey and, y finaliza la declaración con); en vez de ; - Si estuviera iniciando sesión como bob con la contraseña de contraseña, esa declaración terminaría como

select count(*) from users where uname=boband pwd=password);

Además, probablemente debería usar la función selectionArgs, en lugar de concatenar nombre de usuario y contraseña de inicio de sesión.

Para usar selectionArgs, haría algo como

final String SQL_STATEMENT = "SELECT COUNT(*) FROM users WHERE uname=? AND pwd=?";

private void someMethod() {
    Cursor c = db.rawQuery(SQL_STATEMENT, new String[] { loginname, loginpass });
    ...
}
Dre
fuente
22

Suponiendo que ya tiene establecida una dbconexión Database ( ), creo que la forma más elegante es seguir la Cursorclase y hacer algo como:

String selection = "uname = ? AND pwd = ?";
String[] selectionArgs = {loginname, loginpass};
String tableName = "YourTable";
Cursor c = db.query(tableName, null, selection, selectionArgs, null, null, null);
int result = c.getCount();
c.close();
return result;
Eloi Navarro
fuente
2
Debería especificar al menos una columna. Pasar un valor nulo devolverá todas las columnas, lo que no se recomienda para evitar la lectura de datos del almacenamiento que no se utilizarán. #perfmatters
redochka
De hecho, si la información necesaria es solo un recuento, recuperar una sola columna (ID, por ejemplo) sería más que suficiente
Eloi Navarro
12

cómo obtener la columna de recuento

final String DATABASE_COMPARE = "select count(*) from users where uname="+loginname+ "and pwd="+loginpass;

int sometotal = (int) DatabaseUtils.longForQuery(db, DATABASE_COMPARE, null);

Esta es la alternativa más concisa y precisa. No es necesario manejar cursores y su cierre.

kontinuity
fuente
Increíble - he estado trabajando con Android desde siempre y nunca supe de este DatabaseUtils - Google debería ser mejor promocionando sus utils ...
slott
6

Si está utilizando ContentProvider, puede utilizar:

Cursor cursor = getContentResolver().query(CONTENT_URI, new String[] {"count(*)"},
            uname=" + loginname + " and pwd=" + loginpass, null, null);
    cursor.moveToFirst();
    int count = cursor.getInt(0);
Beshoy Fayez
fuente
5

Otra forma sería usar:

myCursor.getCount();

en un Cursor como:

Cursor myCursor = db.query(table_Name, new String[] { row_Username }, 
row_Username + " =? AND " + row_Password + " =?",
new String[] { entered_Password, entered_Password }, 
null, null, null);

Si puede pensar en alejarse de la consulta en bruto.

Jochen Reinschlüssel
fuente
5

Si desea obtener el recuento de registros, debe aplicar el grupo por en algún campo o aplicar la siguiente consulta.

Me gusta

db.rawQuery("select count(field) as count_record from tablename where field =" + condition, null);
Chirag
fuente
1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Antoine Luckenson
fuente