J'utilise la méthode de requête de SQLiteDatabase. Comment utiliser la méthode de requête?
J'ai essayé ceci:
Cursor cursor = sqLiteDatabase.query(
tableName, tableColumns, whereClause, whereArgs, groupBy, having, orderBy);
tableColumns - le paramètre de colonnes est construit comme suit.
String[] columns = new String[]{KEY_ID, KEY_CONTENT};
Si nous avons besoin d'obtenir tous les champs, comment le paramètre de colonne doit-il être construit. Avons-nous besoin d'inclure tous les noms de champ dans le tableau String?
Comment utiliser correctement la méthode de requête?
Réponses:
tableColonnes
null
pour toutes les colonnes comme dansSELECT * FROM ...
new String[] { "column1", "column2", ... }
pour des colonnes spécifiques comme dansSELECT column1, column2 FROM ...
- vous pouvez également mettre des expressions complexes ici:new String[] { "(SELECT max(column1) FROM table1) AS max" }
vous donnerait une colonne nomméemax
contenant la valeur maximale decolumn1
whereClause
WHERE
sans ce mot-clé, par exemple"column1 > 5"
?
pour les choses qui sont dynamiques, par exemple"column1=?"
-> voirwhereArgs
whereArgs
?
dans lequelwhereClause
il apparaîtles autres
whereClause
l'instruction après le mot-clé ounull
si vous ne l'utilisez pas.Exemple
équivaut à la requête brute suivante
En utilisant la version Where / Bind -Args, vous obtenez automatiquement des valeurs échappées et vous n'avez pas à vous inquiéter si les données d'entrée contiennent
'
.Non
String whereClause = "column1='" + value + "'";
sûr: sûr:
String whereClause = "column1=?";
parce que si value contient une
'
instruction, votre instruction se brise et vous obtenez des exceptions ou fait des choses involontaires, par exemple, vousvalue = "XYZ'; DROP TABLE table1;--"
pourriez même supprimer votre table puisque l'instruction deviendrait deux instructions et un commentaire:l'utilisation de la version args
XYZ'; DROP TABLE table1;--
serait échappée vers'XYZ''; DROP TABLE table1;--'
et ne serait traitée que comme une valeur. Même si le'
n'est pas destiné à faire de mauvaises choses, il est encore assez courant que les gens l'aient dans leurs noms ou l'utilisent dans des textes, des noms de fichiers, des mots de passe, etc. Utilisez donc toujours la version args. (Il est normal de construireint
et d'autres primitives directement danswhereClause
cependant)la source
limit
paramètre, par exemple developer.android.com/reference/android/database/sqlite/ ... c'est juste une simple concaténation de texte à la fin afin que vous puissiez mettre par exemple"some_column LIMIT 10"
dansorderBy
et cela fonctionnerait toujourstable1 CROSS JOIN table2
comme nom de table. Mais il y a un moment où je regarderais rawquery: stackoverflow.com/q/10598137/995891query
méthodes ajoutent simplement quelques mots-clés commeSELECT
etFROM
aux arguments (voir source) puis font unrawQuery
avec la chaîne de requête résultante. Si votre requête ne correspond pas bien aux arguments disponibles dequery
, écrivez simplement la chaîne de requête vous-même.Il s'agit d'une réponse plus générale destinée à être une référence rapide pour les futurs téléspectateurs.
Exemple
Explication de la documentation
la source
La clause Where et les arguments fonctionnent ensemble pour former l'instruction WHERE de la requête SQL. Alors dis que tu cherches à exprimer
Ensuite, votre whereClause et whereArgs seront les suivants
Si vous souhaitez sélectionner toutes les colonnes de table, je pense qu'une chaîne nulle transmise à tableColumns suffira.
la source
?
dans'
l''
est ajouté automatiquement si nécessairesi votre requête SQL est comme ça
Ensuite, pour la méthode query (), nous pouvons faire comme: -
la source
TABLE_ROW_ID + "=" + rowID
, voici=
lawhere
clause. Pour sélectionner toutes les valeurs, vous devrez donner tous les noms de colonnes:et voici un bon tutoriel pour la base de données.
la source