Requête SQLite dans Android pour compter les lignes

91

J'essaie de créer un formulaire de connexion simple, dans lequel je compare l'identifiant de connexion et le mot de passe saisis à l'écran de connexion avec ceux stockés dans la base de données.

J'utilise la requête suivante:

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

Le problème est, je ne sais pas, comment puis-je exécuter la requête ci-dessus et stocker le nombre retourné.

Voici à quoi ressemble la table de la base de données (j'ai réussi à créer la base de données avec succès en utilisant la méthode 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);";

Quelqu'un peut-il gentiment me guider sur la manière dont je peux y parvenir? Si possible, veuillez fournir un exemple d'extrait pour effectuer la tâche ci-dessus.

Arun
la source

Réponses:

121

DatabaseUtils.queryNumEntries (depuis api: 11) est une alternative utile qui élimine le besoin de SQL brut (yay!).

SQLiteDatabase db = getReadableDatabase();
DatabaseUtils.queryNumEntries(db, "users",
                "uname=? AND pwd=?", new String[] {loginname,loginpass});
Scottyab
la source
pour OS <11, il obtient l'erreur NoSuchMethodError, existe-t-il une solution de contournement pour prendre en charge OS <11?
Khobaib
2
@Khobaib Vérifiez la réponse de ghchinoy
Eduardo Herzer
1
@EduardoHerzer J'ai trouvé un moyen avec curseur.getCount () directement.
Khobaib
1
@Khobaib Ce n'est pas une manière très efficace de le faire. Vous devriez toujours préférer utiliser SELECT COUNT(*)et queryNumEntries()sur récupérer tous les enregistrements et voir combien il y en a, c'est-à-dire. cursor.getCount()
DearVolt
114

@scottyab le DatabaseUtils.queryNumEntries paramétré (db, table, whereparams) existe à l'API 11 +, celui sans les paramètres de localisation existe depuis l'API 1 . La réponse devrait être la création d'un curseur avec 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();

J'aime aussi la réponse de @ Dre, avec la requête paramétrée.

ghchinoy
la source
1
Pour ceux qui se demandent, le paramètre pour mCount.getInt()est columnindex. Merci pour l'aide!
T.Woody
62

Utilisez un SQLiteStatement .

par exemple

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

  long count = s.simpleQueryForLong();
Teknogrebo
la source
1
Une chose que j'aime dans cette réponse par rapport à la réponse de @ scottyab (qui est également très bonne) est que vous pouvez spécifier une clause LIMIT dans ce cas. Ceci est utile lorsque vous voulez simplement savoir s'il y a des lignes dans une table (par exemple, sélectionnez (count (*)> 0) dans TABLE LIMIT 1) vs aucune ligne. J'imagine que ce sera plus rapide lorsque la table ne peut avoir aucune ligne ou une tonne de lignes. C'est le cas spécifique que j'ai eu lors de la recherche de ceci ...
stuckj
@Teknogrebo: C'est une bonne réponse, même si j'utiliserais la version paramétrée. Vous pouvez utiliser ?s dans la requête, puis utiliser bindString(int, String)et bindLong(int, long)pour insérer les valeurs. Regardez ici .
DearVolt
22

Voir rawQuery (String, String []) et la documentation pour Cursor

Votre instruction SQL DADABASE_COMPARE est actuellement invalide loginnameet loginpassne sera pas échappée, il n'y a pas d'espace entre loginnameet le and, et vous terminez l'instruction par); au lieu de ; - Si vous vous connectez en tant que bob avec le mot de passe du mot de passe, cette déclaration se terminerait par

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

De plus, vous devriez probablement utiliser la fonction selectionArgs, au lieu de concaténer loginname et loginpass.

Pour utiliser selectionArgs, vous feriez quelque chose comme

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
la source
22

En supposant que vous ayez déjà une dbconnexion Database ( ) établie, je pense que le moyen le plus élégant est de s'en tenir à la Cursorclasse et de faire quelque chose comme:

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
la source
2
Vous devez au moins spécifier une colonne. La transmission de null renverra toutes les colonnes, ce qui est déconseillé pour empêcher la lecture de données du stockage qui ne seront pas utilisées. #perfmatters
redochka
En fait, si les informations nécessaires ne sont qu'un décompte, récupérer une seule colonne (ID par exemple) serait plus que suffisant
Eloi Navarro
12

comment obtenir la colonne count

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

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

C'est l'alternative la plus concise et la plus précise. Pas besoin de manipuler les curseurs et leur fermeture.

continuité
la source
Incroyable - je travaille avec Android depuis toujours et je n'ai jamais su à propos de ce DatabaseUtils - Google devrait être meilleur dans la promotion de leurs utils ...
slott
6

Si vous utilisez ContentProvider, vous pouvez utiliser:

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
la source
5

Une autre façon serait d'utiliser:

myCursor.getCount();

sur un curseur comme:

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 vous pouvez penser à vous éloigner de la requête brute.

Jochen Reinschlüssel
la source
5

Si vous souhaitez obtenir le nombre d'enregistrements, vous devez appliquer le groupe par sur un champ ou appliquer la requête ci-dessous.

Comme

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