如何在android中的特殊字符,如'在sqlite中
我有一个在SQLite数据库的表上执行查询的函数。 我声明一个常量: public static final String CANADA_HISTORY = "Canada's History";
。 这是存储在一个String
variables让我们说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("'", "\\'")
或者我错了吗?