请问有人能告诉我如何在 Android 中的 SQLite 数据库中转义或替换不支持的字符,比如单引号吗?可以举个例子吗?
谢谢!
String value = "one's self";
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...
将其更改为
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() ...
最好使用预处理语句
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
这样做可以防止"SQL注入攻击"。
请参考http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html了解更多信息。
编辑: 我进行了更深入的研究,你可以使用DatabaseUtils.sqlEscapeString(String)来转义字符串内容,以便它适用于一个完整的SQL语句而不需要准备工作。
实际上,最简单的方法是用两个单引号('')替换单引号(')。你的查询将变成:
insert into tname(foo) values ('one''s self');
解释: SQLite 倡导使用单引号(')作为字符串定界符,而不是双引号("),称这是 SQL 标准所要求的(我无法确认这一点)。SQLite 还与我知道的所有其他 SQL 数据库不同,它使用''而不是\ ',同样声称符合 SQL 标准。(同样,我无法确认此声明)。
就个人而言,我倾向于不同意这种说法,因为我知道的每个其他 SQL 数据库都使用 C 转义字符的方法,反斜杠。即使某个地方在 ISO 的 SQL 标准中用 '' 来表示转义,我认为最好修改该标准以使用 C 方式,因为在实践中,它已经成为了标准。
请注意:
insert into tname(foo) values ('ones "self"');
根据这个逻辑,这是一个有效的SQL语句,不需要额外的转义。
这些不是用简单的 \ 完成的吗?所以,你的单引号应该是 \'。
DatabaseUtils.sqlEscapeString()
方法,它会为您处理一切。但请记住,它还会在字符串前后添加单引号“'”,因此如果您手动构造查询,请务必将其删除,因为该方法也会添加它们,这将导致您的查询无效。 感谢@DaveG提供的解决方案! - Ionut NegruDatabaseUtils.sqlEscapeString()
- 确实是迄今为止最好的方法 - Richard Le MesurierDatabaseUtils.sqlEscapeString()
可以在任何地方使用吗?例如,如果我需要对表名或列类型进行清理,是否可以使用它? - Michael