45

我有一个函数正在对 SQLite 数据库中的表执行查询。我声明一个常量:public static final String CANADA_HISTORY = "Canada's History";. 这存储在一个String变量中,比如说difficulty

我有一个查询:

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

它在撇号附近抛出异常。

日志输出:

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'

我也试过:

1.  difficulty=difficulty.replaceAll("'","''");
2.  difficulty=difficulty.replaceAll("'","\'");
3.  difficulty = DatabaseUtils.sqlEscapeString(difficulty);

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

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

4

9 回答 9

87

SQL 标准指定字符串中的单引号通过将两个单引号放在一行中来进行转义。在这方面,SQL 的工作方式类似于 Pascal 编程语言。SQLite 遵循这个标准。例子:

INSERT INTO xyz VALUES('5 O''clock');

参考:SQLite 常见问题解答

于 2012-09-27T06:27:00.397 回答
53

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

DatabaseUtils.sqlEscapeString(String)

这是它的在线文档:

在我看来,使用这种方法的主要优点是由于方法名称清晰,所以可以自我记录。

于 2014-11-22T20:20:52.663 回答
27

对我有用的是

if (columnvalue.contains("'")) {
    columnvalue = columnvalue.replaceAll("'", "''");
}
于 2014-07-10T09:44:20.487 回答
26

首先用这个替换char

difficulty=difficulty.replaceAll("'","\\'");

然后在您的查询中传递它

"select * from Questions_answers where CHAPTERS='"+difficulty+"'";

编辑 :

 q = "select * from Questions_answers where CHAPTERS = ?";
    database.rawQuery(q, new String[] { difficulty});
于 2012-09-27T06:15:07.057 回答
4

你可以试试Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = \""+difficulty+"\"" , null);

于 2012-09-27T06:32:40.300 回答
2

这将是相同的:

if (columnValue.contains("'")) 
    columnValue = columnValue.replaceAll("'", "[']");

或者

if (columnValue.contains("'")) 
    columnValue = columnValue.replaceAll("'", "\\\'");

但实际上我们使用下一个符号 % 和 _

于 2015-12-10T12:05:22.657 回答
2

DatabaseUtils.sqlEscapeString(s)本质上,是将所有单引号 ( )替换'为两个单引号 ( ''),并在字符串的开头附加一个单引号,在字符串的末尾附加一个单引号。
因此,如果您只想转义字符串,此函数应该可以工作:

private static String escape(String s) {
    return s != null ? s.replaceAll("\'", "\'\'") : null;
}
于 2017-04-19T08:55:51.693 回答
0

据我了解,有两种方法,

String test= "Android 的版本" test= test.replace("'","''");

这种情况绝对没问题,但我肯定会建议使用以下方法。

String test= "Android 的版本" test= test.replaceAll("'","\'");

当我们尝试使用 '.

于 2016-02-17T08:50:09.593 回答
-2

你不需要逃避 \ 吗?所以它会是replaceAll("'", "\\'")或者我错了?

于 2012-09-27T06:25:09.397 回答