Query SQLite in Android per contare le righe


91

Sto cercando di creare un semplice modulo di accesso, in cui confronto l'ID di accesso e la password immessi nella schermata di accesso con quelli memorizzati nel database.

Sto usando la seguente query:

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

Il problema è, non lo so, come posso eseguire la query sopra e memorizzare il conteggio restituito.

Ecco come appare la tabella del database (sono riuscito a creare il database con successo utilizzando il metodo 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);";

Qualcuno può gentilmente guidarmi su come posso raggiungere questo obiettivo? Se possibile, fornisci uno snippet di esempio per eseguire l'attività precedente.

Risposte:


121

DatabaseUtils.queryNumEntries (da api: 11) è un'alternativa utile che elimina la necessità di SQL grezzo (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});

per OS <11, riceve l'errore NoSuchMethodError, c'è qualche soluzione per il supporto per OS <11?
Khobaib

2
@Khobaib Controlla la risposta di ghchinoy
Eduardo Herzer

1
@EduardoHerzer Ho trovato un modo con cursor.getCount () direttamente.
Khobaib

1
@Khobaib Non è un modo molto efficiente per farlo. Dovresti sempre preferire usare SELECT COUNT(*)e queryNumEntries()oltre il recupero di tutti i record e vedere quanti sono, ad es. cursor.getCount()
DearVolt

114

@scottyab il DatabaseUtils.queryNumEntries parametrizzato (db, table, whereparams) esiste nell'API 11 +, quello senza whereparams esiste dall'API 1 . La risposta dovrebbe essere la creazione di un cursore con 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();

Mi piace anche la risposta di @ Dre, con la query parametrizzata.


1
Per coloro che si chiedono, il parametro per mCount.getInt()è columnindex. Grazie per l'aiuto!
T.Woody

62

Usa un SQLiteStatement .

per esempio

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

  long count = s.simpleQueryForLong();

1
Una cosa che mi piace di questa risposta rispetto alla risposta di @ scottyab (che è anche molto buona) è che puoi specificare una clausola LIMIT in questo caso. Ciò è utile quando si desidera solo sapere se sono presenti QUALSIASI riga in una tabella (ad esempio, selezionare (count (*)> 0) da TABLE LIMIT 1) anziché nessuna riga. Immagino che sarà più veloce quando la tabella potrebbe non avere righe o una tonnellata di righe. Questo è il caso specifico che ho avuto durante la ricerca di questo ...
bloccato il

@Teknogrebo: questa è una bella risposta, anche se userei la versione parametrizzata. È possibile utilizzare ?s nella query e quindi utilizzare bindString(int, String)e bindLong(int, long)per inserire i valori. Vedi qui .
DearVolt

22

Vedi rawQuery (String, String []) e la documentazione per Cursor

La tua istruzione SQL DADABASE_COMPARE non è attualmente valida loginnamee loginpassnon sarà sottoposta a escape, non c'è spazio tra loginnamee ande, e finisci l'istruzione con); invece di ; - Se accedessi come bob con la password della password, quella dichiarazione finirebbe come

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

Inoltre, dovresti probabilmente usare la funzione selectionArgs, invece di concatenare loginname e loginpass.

Per usare selectionArgs dovresti fare qualcosa di simile

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

Supponendo che tu abbia già dbstabilito una connessione Database ( ), penso che il modo più elegante sia attenersi alla Cursorclasse e fare qualcosa come:

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
Dovresti almeno specificare una colonna. Il passaggio di null restituirà tutte le colonne, il che è sconsigliato per impedire la lettura dei dati dall'archiviazione che non verranno utilizzati. #perfmatters
redochka

Infatti se le informazioni necessarie sono solo un conteggio, recuperare una singola colonna (ID per esempio) sarebbe più che sufficiente
Eloi Navarro

12

come ottenere la colonna del conteggio

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

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

Questa è l'alternativa più concisa e precisa. Non c'è bisogno di gestire i cursori e la loro chiusura.


Incredibile: lavoro con Android da sempre e non ho mai saputo di questo DatabaseUtils - Google dovrebbe essere più bravo a promuovere le loro utilità ...
slott

6

Se stai usando ContentProvider, puoi usare:

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

5

Un altro modo sarebbe usare:

myCursor.getCount();

su un cursore come:

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

Se riesci a pensare di allontanarti dalla query grezza.


5

Se si desidera ottenere il conteggio dei record, è necessario applicare il gruppo in base a un campo o applicare la query seguente.

Piace

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();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.