Android在sql查询字符串中引用

mia*_*lle 44 sqlite android

我想执行如下查询:

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

如果用户在输入中输入单引号,则会崩溃.如果您将其更改为:

p_query = "select * from mytable where name_field = \"" +  uvalue + "\"" ;
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*ger 129

您应该使用rawQuery方法的selectionArgs参数:

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

这不仅可以解决您的报价问题,还可以减轻问题SQL Injection.

  • 实际上,您应该使用查询参数.但是,如果需要,您还可以使用DatabaseUtils转义字符串.例如,DatabaseUtils.sqlEscapeString().这不是最好的方式,但它是可用的.如果您尝试将原始SQL语句传递给外部事物,则可能很有用. (20认同)
  • 我希望我能不止一次upmod这个! (6认同)

小智 14

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


小智 5

你应该改变

p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;
Run Code Online (Sandbox Code Playgroud)

喜欢

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ;
Run Code Online (Sandbox Code Playgroud)

  • 但您需要删除引号,因为它们是默认添加的 (2认同)