【问题标题】:Android quotes within an sql query stringsql查询字符串中的Android引号
【发布时间】:2010-11-20 17:42:06
【问题描述】:

我想执行如下查询:

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 + "\"" ;

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

【问题讨论】:

标签: android sqlite


【解决方案1】:

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

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

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

【讨论】:

  • 我希望我可以多次升级它!
  • 它也快得多,因为Sqlite不必解析每个sql语句。
  • 确实,您应该使用查询参数。但是,如果需要,您也可以使用 DatabaseUtils 来转义字符串。例如,DatabaseUtils.sqlEscapeString()。这不是最好的方法,但它是可用的。如果您尝试将原始 SQL 语句传递给外部对象,这可能会很有用。
  • @lilbyrdie:谢谢!由于无法绑定字符串向量以与 IN 运算符一起使用,因此 sqlEscapeSting() 正是我所需要的!
  • 这并不像你想象的那么好。如果您使用这样的字符串,它会中断:“sample " string ' that breaks stuff"
【解决方案2】:

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

【讨论】:

  • DatabaseUtils.sqlEscapeString在需要替换所有特殊字符的情况下替换一两个特殊字符,有没有办法替换指定或所有特殊字符?
【解决方案3】:

你应该改变

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

喜欢

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

【讨论】:

  • 但您需要删除引号,因为它们是默认添加的
【解决方案4】:

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

【讨论】:

  • 我更喜欢使用最佳答案,但在我的情况下,它不可能用于应用程序设计。这也有效
【解决方案5】:

我更喜欢使用 Sqlite 在每个插入语句中转义单引号和双引号,如下所示:

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

【讨论】:

    【解决方案6】:

    我有同样的问题,但现在只需编写如下代码即可解决 在您的情况下,您要插入值 uvalue 。然后写为

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

    酷..!!

    【讨论】:

    • 这太愚蠢了,你将 ' 替换为 '' 仍然会导致问题。
    • @stealthcopter 这并不愚蠢,在字符串文字中转义单引号的标准 SQL 方法是将其加倍,因此 '''' 是包含一个单引号的 SQL 字符串文字。为 SQL 手动转义字符串可能不是最好的主意,但在这种情况下结果是正确的。
    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 2017-10-08
    • 2013-06-12
    • 2022-10-24
    • 1970-01-01
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多