Comment utiliser des instructions préparées dans SQlite sous Android?
android
sqlite
prepared-statement
pupeno
la source
la source
Réponses:
J'utilise tout le temps des déclarations préparées sous Android, c'est assez simple:
la source
SQLiteStatement.bindXXX()
a un index basé sur 1, pas basé sur 0 comme la plupart des.Pour les instructions SQLite préparées sous Android, il existe SQLiteStatement . Les instructions préparées vous aident à accélérer les performances (en particulier pour les instructions qui doivent être exécutées plusieurs fois) et à éviter les attaques par injection. Consultez cet article pour une discussion générale sur les déclarations préparées.
SQLiteStatement
est destiné à être utilisé avec des instructions SQL qui ne renvoient pas plusieurs valeurs. (Cela signifie que vous ne les utiliserez pas pour la plupart des requêtes.) Voici quelques exemples:Créer une table
La
execute()
méthode ne renvoie pas de valeur, il est donc approprié de l'utiliser avec CREATE et DROP, mais n'est pas destinée à être utilisée avec SELECT, INSERT, DELETE et UPDATE car ces valeurs retournent. (Mais voyez cette question .)Insérer des valeurs
Notez que la
executeInsert()
méthode est utilisée plutôt queexecute()
. Bien sûr, vous ne voudriez pas toujours entrer les mêmes choses dans chaque ligne. Pour cela, vous pouvez utiliser des liaisons .Habituellement, vous utilisez des instructions préparées lorsque vous souhaitez répéter rapidement quelque chose (comme un INSERT) plusieurs fois. L'instruction préparée fait en sorte que l'instruction SQL n'ait pas à être analysée et compilée à chaque fois. Vous pouvez accélérer les choses encore plus en utilisant des transactions . Cela permet d'appliquer toutes les modifications en même temps. Voici un exemple:
Consultez ces liens pour plus d'informations sur les transactions et l'accélération des insertions de bases de données.
Mettre à jour les lignes
Ceci est un exemple basique. Vous pouvez également appliquer les concepts de la section ci-dessus.
Supprimer des lignes
La
executeUpdateDelete()
méthode peut également être utilisée pour les instructions DELETE et a été introduite dans l'API 11. Voir cette Q&R .Voici un exemple.
Requete
Normalement, lorsque vous exécutez une requête, vous souhaitez récupérer un curseur avec beaucoup de lignes. Ce n'est pas pour ça
SQLiteStatement
, cependant. Vous n'exécutez pas de requête avec lui, sauf si vous n'avez besoin que d'un résultat simple, comme le nombre de lignes dans la base de données, que vous pouvez faire avecsimpleQueryForLong()
Habituellement, vous exécuterez la
query()
méthode de SQLiteDatabase pour obtenir un curseur.Consultez cette réponse pour plus de détails sur les requêtes.
la source
clearBindings()
ne les définissent pas seulement surnull
(voir le code source ). Je vois cela comme un effacement de l'état afin que rien ne l'influençât de la boucle précédente. Ce n'est peut-être pas nécessaire, cependant. Je serais heureux que quelqu'un sache commenter.Si vous voulez un curseur au retour, vous pouvez envisager quelque chose comme ceci:
Voir cet extrait de Genscripts au cas où vous en voudriez un plus complet. Notez qu'il s'agit d'une requête SQL paramétrée, c'est donc essentiellement une instruction préparée.
la source
L'exemple de jasonhudgins ne fonctionnera pas. Vous ne pouvez pas exécuter une requête avec
stmt.execute()
et récupérer une valeur (ou aCursor
).Vous ne pouvez précompiler que les instructions qui ne retournent aucune ligne (comme une instruction insert ou create table) ou une seule ligne et colonne (et utilisez
simpleQueryForLong()
ousimpleQueryForString()
).la source
Pour obtenir un curseur, vous ne pouvez pas utiliser un compiledStatement. Cependant, si vous souhaitez utiliser une instruction SQL préparée complète, je recommande une adaptation de la méthode de jbaez ... Utiliser
db.rawQuery()
au lieu dedb.query()
.la source