93 votes

Requête SQLite dans Android pour compter les lignes

J'essaie de créer un formulaire de connexion simple, dans lequel je compare l'identifiant 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 que je ne sais pas comment 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 me guider sur la façon dont je peux y parvenir ? Si possible, veuillez fournir un exemple d'extrait de code pour effectuer la tâche ci-dessus.

124voto

scottyab Points 6760

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

0 votes

Pour OS < 11, il obtient l'erreur NoSuchMethodError, y a-t-il une solution de contournement pour supporter OS < 11 ?

2 votes

@Khobaib Vérifiez la réponse de ghchinoy.

1 votes

@EduardoHerzer J'ai trouvé une solution avec cursor.getCount() directement.

118voto

ghchinoy Points 742

@scottyab le paramétré DatabaseUtils.queryNumEntries(db, table, whereparams) existe à l'API 11 +, celui sans le whereparams existe depuis l'API 1 . La réponse devrait être de créer 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.

1 votes

Pour ceux qui se posent la question, le paramètre pour mCount.getInt() es columnindex . Merci pour votre aide !

62voto

Teknogrebo Points 372

Utilisez un Déclaration SQLite .

par exemple

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

  long count = s.simpleQueryForLong();

1 votes

Une chose que j'apprécie dans cette réponse par rapport à celle de @scottyab (qui est également très bonne) est que vous pouvez spécifier une clause LIMIT dans ce cas. C'est utile lorsque vous voulez juste savoir s'il y a TOUTES les lignes dans une table (par exemple, select (count(*) > 0) from TABLE LIMIT 1) vs aucune ligne. Je suppose que ce sera plus rapide lorsque la table peut n'avoir aucun rang ou une tonne de rangs. C'est le cas spécifique que j'ai eu en cherchant cela...

0 votes

@Teknogrebo : C'est une belle réponse, bien que j'utiliserais la version paramétrée. Vous pouvez utiliser ? dans la requête, puis utiliser bindString(int, String) y bindLong(int, long) pour insérer les valeurs. Voir aquí .

23voto

Dre Points 2813

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

Votre instruction SQL DADABASE_COMPARE est actuellement invalide, loginname y loginpass ne sera pas échappé, il n'y a pas d'espace entre loginname y el and et vous terminez la déclaration par ) ; au lieu de ; -- Si vous vous connectez en tant que bob avec le mot de passe password, cette déclaration se terminerait comme suit

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

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

Pour utiliser les selectionArgs, il faut faire 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 });
    ...
}

22voto

Eloi Points 611

En supposant que vous avez déjà une base de données ( db ) établie, je pense que la manière la plus élégante est de s'en tenir à la connexion Cursor et 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;

2 votes

Vous devriez au moins spécifier une colonne. Passer null retournera toutes les colonnes, ce qui est déconseillé pour éviter de lire des données d'un stockage qui ne sera pas utilisé. #perfmatters

0 votes

En fait, si l'information nécessaire n'est qu'un compte, la récupération d'une seule colonne (ID par exemple) serait plus que suffisante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X