2009-08-18 5 views
41

Je veux effectuer une requête comme suit:citations Android dans une chaîne de requête SQL

uvalue = EditText(some user value); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

si l'utilisateur entre un guillemet simple dans leur entrée, il se bloque. Si vous le modifiez à:

p_query = "select * from mytable where name_field = \"" + uvalue + "\"" ; 

il se bloque si l'utilisateur entre un double guillemet dans leur entrée. et bien sûr ils pourraient toujours entrer des guillemets simples et doubles.

+0

miannelle, consultez ces questions connexes: http://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql http://stackoverflow.co m/questions/387198/escape-double-quotes-in-sql-2005-2008 –

+3

miannelle: Vous devriez regarder quelques-unes de vos questions comme "répondues" – Kurru

Répondre

125

Vous devriez utiliser le paramètre de la méthode rawQueryselectionArgs:

p_query = "select * from mytable where name_field = ?"; 
mDb.rawQuery(p_query, new String[] { uvalue }); 

Cela résout non seulement votre problème de citations, mais aussi pallie SQL Injection.

+5

J'aurais aimé pouvoir le faire plus d'une fois! – jrockway

+1

C'est aussi beaucoup plus rapide car Sqlite n'a pas besoin d'analyser chaque instruction SQL. – tuinstoel

+20

En effet, vous devriez utiliser des arguments de requête. Cependant, vous pouvez également utiliser DatabaseUtils pour échapper des chaînes, si nécessaire. Par exemple, DatabaseUtils.sqlEscapeString(). Ce n'est pas la meilleure façon, mais c'est disponible. Cela peut être utile si vous essayez de passer une instruction SQL brute à quelque chose d'externe. – lilbyrdie

14

DatabaseUtils.sqlEscapeString a fonctionné correctement pour moi. La chaîne est entourée de guillemets simples et les guillemets simples dans la chaîne deviennent des guillemets doubles. Essayé en utilisant selectionArgs dans le getContentResolver(). Query() mais cela n'a pas fonctionné du tout.

2

Avez-vous essayé de remplacer un guillemet simple par 2 guillemets simples? Cela fonctionne pour entrer des données dans une base de données.

+0

Je préférerais utiliser la première réponse, mais dans mon cas ce n'était pas possible faire à la conception de l'application.Cela fonctionne aussi – Patrick

1

J'ai même problème, mais maintenant il est résolu en écrivant simplement le code comme dans votre cas, vous souhaitez insérer la valeur UValue .Ensuite écrire comme

uvalue= EditText(some user value); 
uvalue = uvalue.replaceAll("'", "''"); 
p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 
mDb.rawQuery(p_query, null); 

cool .. !!

+1

c'est stupide, vous remplacez «avec» ce qui causera toujours des problèmes. – stealthcopter

+0

Peut-être stupide, mais fonctionne bien pour moi. Merci –

+0

@stealthcopter Ce n'est pas stupide, la manière standard d'échapper une simple citation dans un littéral de chaîne est de le doubler afin que ''' '' 'soit un littéral de chaîne SQL qui contient un seul guillemet. L'échappement manuel des chaînes pour SQL n'est peut-être pas la meilleure idée mais le résultat est correct dans ce cas. –

1

Je préfère échapper les guillemets simples et guillemets doubles dans chaque instruction d'insertion avec SQLite comme ceci:

String sqlite_stament = sqlite_stament.replace("'", "''").replace("\"", "\"\""); 
2

Vous devez changer

p_query = "select * from mytable where name_field = '" + uvalue + "'" ; 

comme

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ; 
+0

Solution géniale et claire –

+0

mais vous devez supprimer les guillemets car ils sont ajoutés par défaut –

Questions connexes