如何在Android上的SQLite中转义不受支持的字符?

moh*_*han 17 sqlite android

任何人都可以告诉如何逃脱或替换不支持的字符,如android中的sqlite中的单引号可以任何人举例

谢谢

Dav*_*e G 41

您可以使用commons-lang实用程序,也可以使用regexp来处理它.

如果你正在构建动态SQL,我建议尝试使用一个准备好的语句,这将消除转义单引号的需要.

仅使用使用字符串连接构建的动态SQL:

String value = "one's self";
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...
Run Code Online (Sandbox Code Playgroud)

改为

String value = "one's self";
value= DatabaseUtils.sqlEscapeString(value);
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...
Run Code Online (Sandbox Code Playgroud)

理想情况下,使用准备好的声明

String value = "one's self";
StringBuilder query= StringBuilder();
query.append("insert into tname(foo) values (?)");
SQLiteStatement stmt= db.compileStatement(query.toString());
stmt.bindString(1, value);
long rowId= stmt.executeInsert();
// do logic check for > -1 on success
Run Code Online (Sandbox Code Playgroud)

这样您就不会遇到"SQL注入攻击".

有关更多信息,请参阅http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html.

编辑 我做了一些挖掘,您可以使用DatabaseUtils.sqlEscapeString(String)来转义字符串的内容,以便它对没有准备的完整SQL语句有效.

  • @mohan肯定会看看我上面专门用DatabaseUtils.sqlEscapeString(String)方法发布的答案.这将"清理"您的输入,允许您将值连接到字符串中.我将编辑我的答案以涵盖动态值. (2认同)
  • 最好的答案,`DatabaseUtils.sqlEscapeString()`为您处理一切.但请记住,它也会在之前和之后添加"'",因此如果您手动构建查询,请务必删除它们,因为该方法也会添加它们,您最终会得到双倍"'",这将使您的查询无效.谢谢@DaveG的解决方案! (2认同)