2009-08-18 18 views
41

Ich möchte eine Abfrage wie folgt auszuführen:Android Anführungszeichen innerhalb einer SQL-Abfrage-String

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

, wenn der Benutzer einen Apostroph in ihrem Eingang betritt stürzt. Wenn Sie es ändern in:

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

stürzt es ab, wenn der Benutzer ein Doppelzitat in ihre Eingabe eingibt. und natürlich konnten sie immer sowohl einfache als auch doppelte Anführungszeichen eingeben.

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

Dies löst nicht nur Ihre Angebote Problem, sondern mildert auch SQL Injection:

+0

miannelle Besuche diese verwandten Fragen: 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: Sie sollten einige Ihrer Fragen als "geantwortet" markieren – Kurru

Antwort

125

Sie sollten Verwendung der rawQuery Methode des selectionArgs Parameter machen.

+5

Ich wünschte, ich könnte dies mehr als einmal upmod! – jrockway

+1

Es ist auch viel schneller, weil Sqlite nicht jede SQL-Anweisung analysieren muss. – tuinstoel

+20

In der Tat sollten Sie Abfrageargumente verwenden. Sie können die DatabaseUtils jedoch auch verwenden, um bei Bedarf Strings zu entschlüsseln. Zum Beispiel DatabaseUtils.sqlEscapeString(). Es ist nicht der beste Weg, aber es ist verfügbar. Kann nützlich sein, wenn Sie versuchen, eine rohe SQL-Anweisung an etwas Externes zu übergeben. – lilbyrdie

14

DatabaseUtils.sqlEscapeString funktionierte ordnungsgemäß für mich. Die Zeichenfolge wird von einfachen Anführungszeichen umschlossen und die einfachen Anführungszeichen in der Zeichenfolge werden in doppelte Anführungszeichen gesetzt. Erprobt mit selectionArgs in der getContentResolver(). Query() aber es hat überhaupt nicht funktioniert.

2

Haben Sie versucht, ein einfaches Angebot durch 2 einfache Anführungszeichen zu ersetzen? Das funktioniert für die Eingabe von Daten in eine Datenbank.

+0

Ich würde lieber die oberste Antwort verwenden, aber in meinem Fall war es nicht möglich, um Anwendungsdesign.Das funktioniert auch – Patrick

1

Ich habe gleiches Problem, aber jetzt ist es nur durch das Schreiben des Code wie in Ihrem Fall Sie Wert U-Wert .Dann einfügen gelöst schreiben als

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

kühlen .. !!

+1

das ist dumm, du ersetzt 'mit' ', was immer noch Probleme verursacht. – stealthcopter

+0

Vielleicht dumm, aber funktioniert gut für mich. Danke –

+0

@stealthcopter Das ist nicht blöd, die SQL-Standardmethode, ein einzelnes Anführungszeichen in einem String-Literal zu umgehen, besteht darin, es zu verdoppeln, also ist ein SQL-String-Literal, das ein einzelnes Anführungszeichen enthält. Das manuelle Entkommen von Strings für SQL ist möglicherweise nicht die beste Idee, aber das Ergebnis ist in diesem Fall korrekt. –

1

ziehe ich Einzel und doppelte Anführungszeichen in jeder INSERT-Anweisung mit SQLite so zu entkommen:

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

Sie sollten

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

wie

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

Awesome und klare Lösung –

+0

aber Sie müssen Zitate entfernen, weil sie standardmäßig hinzugefügt werden –

Verwandte Themen