Rah*_*tel 43 sqlite android 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);
Run Code Online (Sandbox Code Playgroud)
它在撇号附近抛出异常.
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'
Run Code Online (Sandbox Code Playgroud)
我也尝试过:
1. difficulty=difficulty.replaceAll("'","''");
2. difficulty=difficulty.replaceAll("'","\'");
3. difficulty = DatabaseUtils.sqlEscapeString(difficulty);
Run Code Online (Sandbox Code Playgroud)
除此之外,它对我来说是单词Canada History,我的意思是没有特殊的字符.
请给我解决问题的建议谢谢.
Pan*_*mar 86
SQL标准指定通过在行中放入两个单引号来转义字符串中的单引号.SQL就像Pascal编程语言一样.SQLite遵循此标准.例:
INSERT INTO xyz VALUES('5 O''clock');
Run Code Online (Sandbox Code Playgroud)
参考:SQLite常见问题
Ric*_*ier 47
最好的方法是使用专为此目的而设计的原生Android方法:
DatabaseUtils.sqlEscapeString(String)
Run Code Online (Sandbox Code Playgroud)
这是在线的文档:
在我看来,使用这种方法的主要优点是自我记录,因为方法名称清晰.
Chi*_*rag 25
首先用这个替换char
difficulty=difficulty.replaceAll("'","\\'");
Run Code Online (Sandbox Code Playgroud)
然后在您的查询中传递它
"select * from Questions_answers where CHAPTERS='"+difficulty+"'";
Run Code Online (Sandbox Code Playgroud)
编辑:
q = "select * from Questions_answers where CHAPTERS = ?";
database.rawQuery(q, new String[] { difficulty});
Run Code Online (Sandbox Code Playgroud)
Dhi*_*ani 25
对我有用的是
if (columnvalue.contains("'")) {
columnvalue = columnvalue.replaceAll("'", "''");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
79480 次 |
| 最近记录: |