我有一个在SQLite数据库中对表执行查询的函数。我宣布一个常数:public static final String CANADA_HISTORY = "Canada's History";
。这存储在String
变量中,例如difficulty
,
我有一个问题:
Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = '"+difficulty+"'" , null);
它在撇号附近抛出异常。
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'
我也尝试过:
1. difficulty=difficulty.replaceAll("'","''");
2. difficulty=difficulty.replaceAll("'","\'");
3. difficulty = DatabaseUtils.sqlEscapeString(difficulty);
除此之外,它正在帮我处理像Canada History
这样的单词,我的意思是没有特殊字符。
请给我解决问题的建议谢谢。
答案 0 :(得分:84)
SQL标准指定通过在行中放入两个单引号来转义字符串中的单引号。 SQL就像Pascal编程语言一样。 SQLite遵循此标准。例如:强> 的
INSERT INTO xyz VALUES('5 O''clock');
参考:SQLite FAQ
答案 1 :(得分:46)
最好的方法是使用专为此目的而设计的原生Android方法:
DatabaseUtils.sqlEscapeString(String)
以下是在线文档:
在我看来,使用这种方法的主要优点是自我记录,因为方法名称清晰。
答案 2 :(得分:25)
首先用此
替换chardifficulty=difficulty.replaceAll("'","\\'");
然后在您的查询中传递
"select * from Questions_answers where CHAPTERS='"+difficulty+"'";
修改:
q = "select * from Questions_answers where CHAPTERS = ?";
database.rawQuery(q, new String[] { difficulty});
答案 3 :(得分:25)
对我有用的是
if (columnvalue.contains("'")) {
columnvalue = columnvalue.replaceAll("'", "''");
}
答案 4 :(得分:3)
您可以尝试Cursor c = mDb.rawQuery("select * from Questions_answers where CHAPTERS = \""+difficulty+"\"" , null);
答案 5 :(得分:2)
这将是相同的:
if (columnValue.contains("'"))
columnValue = columnValue.replaceAll("'", "[']");
或
if (columnValue.contains("'"))
columnValue = columnValue.replaceAll("'", "\\\'");
但实际上我们使用下一个符号%和_
答案 6 :(得分:1)
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/foo$ [NC] #<-----------------
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
基本上做的是用两个单引号(DatabaseUtils.sqlEscapeString(s)
)替换所有单引号('
)并在开头和结尾添加一个单引号字符串。
因此,如果您只想转义String,则此函数应该起作用:
''
答案 7 :(得分:0)
根据我的理解,有两种方法,
String test =“Android的vaersion” test = test.replace(“'”,“''”);
这种情况绝对没问题,但我绝对建议使用以下方法。
String test =“Android的vaersion” test = test.replaceAll(“'”,“\'”);
当我们尝试更新并选择带有'的SQLite表值时,我们遇到了问题,因为第一种方法。
答案 8 :(得分:-1)
replaceAll("'", "\\'")
或者我错了吗?