如何在android中的特殊字符,如'在sqlite中

我有一个在SQLite数据库的表上执行查询的函数。 我声明一个常量: public static final String CANADA_HISTORY = "Canada's History"; 。 这是存储在一个Stringvariables让我们说difficulty

我有一个查询:

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

它在撇号附近抛出exception。

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

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

首先用这个replacechar

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

然后在你的查询中传递它

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

编辑:

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

SQL标准指定通过在一行中放置两个单引号来逃避string中的单引号。 在这方面,SQL就像Pascal编程语言一样工作。 SQLite遵循这个标准。 例:

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

参考: SQLite的常见问题

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

 DatabaseUtils.sqlEscapeString(String) 

以下是在线文档:

  • Android开发人员的sqlEscapeString()

在我看来,使用这种方法的主要优点是由于方法名称清晰而形成的自我logging。

对我有效的是

 if (columnvalue.contains("'")) { columnvalue = columnvalue.replaceAll("'", "''"); } 

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

这将工作相同:

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

要么

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

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

DatabaseUtils.sqlEscapeString(s)实际上所做的是用两个单引号( '' )replace所有的单引号( ' ),并在string的开头和尾部追加一个单引号。
所以如果你只是想逃避string这个函数应该工作:

 private static String escape(String s) { return s != null ? s.replaceAll("\'", "\'\'") : null; } 

根据我的理解,有两种方法,

String test =“Android's vaersion”test = test.replace(“'”,“''”);

这种情况是绝对好的,但我肯定会build议使用下面的方法。

String test =“Android's vaersion”test = test.replaceAll(“'”,“\'”);

当我们尝试更新并select“SQLite表值”时,我们遇到了这个问题。

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