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

时间:2012-09-27 06:12:00

标签: android sqlite 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);

它在撇号附近抛出异常。

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这样的单词,我的意思是没有特殊字符。

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

9 个答案:

答案 0 :(得分:84)

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

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

参考:SQLite FAQ

答案 1 :(得分:46)

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

DatabaseUtils.sqlEscapeString(String)

以下是在线文档:

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

答案 2 :(得分:25)

首先用此

替换char
difficulty=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("'", "\\'")或者我错了吗?