126 votes

Méthode SQLIteDatabase.query

J’utilise la méthode query de SQLiteDatabase. Comment utiliser la méthode query ?

J’ai essayé ceci :

tableColumns - paramètre colonnes est construit comme suit.

Si nous avons besoin de tous les champs, comment devrait-on le paramètre column à construire. Avons-nous besoin d’inclure tous les noms de champ dans le tableau de chaînes ?

Comment utiliser correctement la méthode query ?

251voto

zapl Points 18808

tableColumns

  • null pour toutes les colonnes comme dans SELECT * FROM ...
  • new String[] { "column1", "column2", ... } pour les colonnes spécifiques comme en SELECT column1, column2 FROM ... - vous pouvez aussi mettre des expressions complexes ici:
    new String[] { "(SELECT max(column1) FROM table1) AS max" } vous donnent une colonne nommée max holding la valeur max de column1

whereClause

  • la partie que vous mettez après WHERE sans que mot-clé, par exemple, "column1 > 5"
  • devrait inclure l' ? pour les choses qui sont dynamiques, par exemple, "column1=?" -> voir whereArgs

whereArgs

  • préciser le contenu qui remplit chaque ? en whereClause dans l'ordre où ils apparaissent

les autres

  • tout comme whereClause de l'instruction après le mot-clé ou null si vous ne l'utilisez pas.

Exemple

String[] tableColumns = new String[] {
    "column1",
    "(SELECT max(column1) FROM table2) AS max"
};
String whereClause = "column1 = ? OR column1 = ?";
String[] whereArgs = new String[] {
    "value1",
    "value2"
};
String orderBy = "column1";
Cursor c = sqLiteDatabase.query("table1", tableColumns, whereClause, whereArgs,
        null, null, orderBy);

// since we have a named column we can do
int idx = c.getColumnIndex("max");

est équivalent à celui-ci raw requête

String queryString =
    "SELECT column1, (SELECT max(column1) FROM table1) AS max FROM table1 " +
    "WHERE column1 = ? OR column1 = ? ORDER BY column1";
sqLiteDatabase.rawQuery(queryString, whereArgs);

En utilisant le Où/Bind-Args version, vous obtenez automatiquement les valeurs d'échappement et vous n'avez pas à vous inquiéter si d'entrée de données contient '.

Dangereux: String whereClause = "column1='" + value + "'";
Coffre-fort: String whereClause = "column1=?";

parce que si la valeur contient un ' votre déclaration se brise et vous obtenez des exceptions ou ne involontaire de choses, par exemple value = "XYZ'; DROP TABLE table1;--" pourrait même tomber votre table depuis la déclaration de devenir deux états et un commentaire:

SELECT * FROM table1 where column1='XYZ'; DROP TABLE table1;--'

en utilisant les arguments de la version XYZ'; DROP TABLE table1;-- serait échappé d' 'XYZ''; DROP TABLE table1;--' , et ne serait traitée comme une valeur. Même si l' ' n'est pas prévu pour faire de mauvaises choses, il est encore assez fréquent que les gens ont dans leur nom ou de l'utiliser dans les textes, les noms de fichiers, mots de passe, etc. Il faut donc toujours utiliser les arguments de la version. (Il est bon de construire int et d'autres primitives directement dans whereClause tout de même)

19voto

Ancantus Points 485

Où clause et args travaillent ensemble pour former l’instruction WHERE de la requête SQL. Alors dites-vous qui cherchent à exprimer

Alors votre whereClause et whereArgs sera comme suit

Si vous souhaitez sélectionner toutes les colonnes de la table, je pense une chaîne nulle transmise à tableColumns suffira.

0voto

Avi Kumar Manku Points 3321
<pre><code></code><p><p><a href="http://www.anotherandroidblog.com/2010/08/04/android-database-tutorial/" rel="nofollow">http://www.anotherandroidblog.com/2010/08/04/Android-Database-tutorial/</a></p></pre>

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