如何逃避像在android中的sqlite中的特殊字符

Rah*_*tel 43 sqlite android special-characters

我有一个函数,它在SQLite数据库中的表上执行查询.我宣布一个常数:public static final String CANADA_HISTORY = "Canada's History";.这存储在一个String变量中,比方说difficulty,

我有一个问题:

Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = '"+difficulty+"'" , null);
Run Code Online (Sandbox Code Playgroud)

它在撇号附近抛出异常.

Logcat输出:

I/Database( 1170): sqlite returned: error code = 1, msg = near "s": syntax error
D/AndroidRuntime( 1170): Shutting down VM
W/dalvikvm( 1170): threadid=1: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime( 1170): FATAL EXCEPTION: main
E/AndroidRuntime( 1170): android.database.sqlite.SQLiteException: near "s": syntax error: , while compiling: select * from Questions_answers where CHAPTERS  = 'Canada's History'
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

1.  difficulty=difficulty.replaceAll("'","''");
2.  difficulty=difficulty.replaceAll("'","\'");
3.  difficulty = DatabaseUtils.sqlEscapeString(difficulty);
Run Code Online (Sandbox Code Playgroud)

除此之外,它对我来说是单词Canada History,我的意思是没有特殊的字符.

请给我解决问题的建议谢谢.

Pan*_*mar 86

SQL标准指定通过在行中放入两个单引号来转义字符串中的单引号.SQL就像Pascal编程语言一样.SQLite遵循此标准.例:

INSERT INTO xyz VALUES('5 O''clock');
Run Code Online (Sandbox Code Playgroud)

参考:SQLite常见问题

  • 这太可怕了.使用selectionArgs.不要试图自己清理sql输入. (8认同)
  • 这个问题针对Android中的SQLite.OP询问如何在查询中输入诸如"`"之类的字符.正确的答案是使用`selectArgs`,它将转义/清理/ ...工作留给SQLite模块本身,它做得很好,而且全面.你建议的只适用于''`. (2认同)
  • 这种评论很愚蠢。绝对没有理由无法成功实现自己的字符串清理程序。这是构建自己的用于动态构建查询的方法的最简单方法之一,这并不是使用参数处理器最简单的方法。 (2认同)

Ric*_*ier 47

最好的方法是使用专为此目的而设计的原生Android方法:

DatabaseUtils.sqlEscapeString(String)
Run Code Online (Sandbox Code Playgroud)

这是在线的文档:

在我看来,使用这种方法的主要优点是自我记录,因为方法名称清晰.

  • 在使用此函数后,我遇到了查询的麻烦,因为它肯定用单引号括起你的字符串,然后它就是你的字符串的一部分,你必须相应地调整你的查询或使用另一种方法来转义字符串.有关详细信息,请访问/sf/ask/2193430641/#33684053 (4认同)

Chi*_*rag 25

首先用这个替换char

difficulty=difficulty.replaceAll("'","\\'");
Run Code Online (Sandbox Code Playgroud)

然后在您的查询中传递它

"select * from Questions_answers where CHAPTERS='"+difficulty+"'";
Run Code Online (Sandbox Code Playgroud)

编辑:

 q = "select * from Questions_answers where CHAPTERS = ?";
    database.rawQuery(q, new String[] { difficulty});
Run Code Online (Sandbox Code Playgroud)

  • 编辑看起来没问题,但答案的第一部分显然是错误的.``''`与``\'"`是相同的字符串(后者只是相同字符序列的替代符号),因此`replace()`语句实际上是一个标识函数.有趣的是接受的答案. (3认同)

Dhi*_*ani 25

对我有用的是

if (columnvalue.contains("'")) {
    columnvalue = columnvalue.replaceAll("'", "''");
}
Run Code Online (Sandbox Code Playgroud)

  • 这对我也有效。为了安全起见,我还在它之前添加了一个空检查。我不敢相信 GOOG 自己的 DatabaseUtils.sqlEscapeString() 方法是如此垃圾。 (2认同)