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.

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

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.


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

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

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;

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.


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

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.


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

1
int nombr = 0;
Cursor cursor = sqlDatabase.rawQuery("SELECT column FROM table WHERE column = Value", null);
nombr = cursor.getCount();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.