2009-08-18 81 views
41

内Android的报价我要像下面这样进行查询:一个SQL查询字符串

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

如果用户输入他们的输入一个单引号,崩溃。如果将其更改为:

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

如果用户在其输入中输入双引号,则会崩溃。 当然,他们总是可以输入单引号和双引号。

+0

miannelle,退房这些相关的问题:http://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql http://stackoverflow.com m/questions/387198/escape-double-quotes-in-sql-2005-2008 – 2009-08-18 20:27:25

+3

miannelle:你应该看看把你的一些问题标记为“回答” – Kurru 2011-06-22 13:27:52

回答

125

你应该利用rawQuery方法的selectionArgs参数:

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

这不仅解决了您的报价问题,而且也减轻SQL Injection

+5

我希望我可以不止一次提升! – jrockway 2009-08-18 20:52:41

+1

它也快得多,因为Sqlite不必解析每个sql语句。 – tuinstoel 2009-08-19 20:33:57

+20

确实,你应该使用查询参数。但是,如果需要,也可以使用DatabaseUtils来转义字符串。例如,DatabaseUtils.sqlEscapeString()。这不是最好的方式,但它是可用的。如果您试图将原始SQL语句传递给外部某个东西,可能会很有用。 – lilbyrdie 2009-08-22 15:50:27

14

DatabaseUtils.sqlEscapeString为我工作正常。该字符串用单引号括起来,字符串内的单引号变为双引号。 尝试在getContentResolver()。query()中使用selectionArgs,但它根本不起作用。

2

您是否尝试用2个单引号替换单引号?这适用于将数据输入到数据库。

+0

我宁愿使用最好的答案,但在我的情况下它不是可能对应用程序设计做什么这工作太 – Patrick 2012-02-27 17:42:41

1

我有同样的问题,但现在却仅通过写要插入像你的情况 代码解决价值uvalue。然后写成

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

凉.. !!

+1

这是愚蠢的,你正在取代'与',这仍然会导致问题。 – stealthcopter 2013-07-19 10:34:03

+0

也许是愚蠢的,但对我来说工作得很好。谢谢 – 2014-02-24 09:53:35

+0

@stealthcopter这并不愚蠢,在字符串文字中转义单引号的标准SQL方法是将其加倍,所以''''''是一个包含一个单引号的SQL字符串文字。为SQL手动转义字符串可能不是最好的主意,但在这种情况下结果是正确的。 – 2017-12-16 20:06:46

1

我宁愿逃避每条insert语句单引号和双引号的SQLite是这样的:

​​
2

你应该改变

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

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

真棒和清晰的解决方案 – 2018-01-14 11:10:26

+0

但您的需要删除报价,因为它们默认添加 – 2018-01-14 11:23:22