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

任何人都可以告诉如何逃生或replace不支持的字符,如android中的单引号在android中可以任何人举例

谢谢

Solutions Collecting From Web of "如何在Android上的SQLite中转义不受支持的字符?"

您可以使用commons-lang实用程序,也可以使用正则expression式来处理它。

如果你正在构builddynamicSQL,我想build议的是试图使用一个准备的语句,这将消除转义单引号的需要。

仅使用使用string连接构build的dynamicSQL:

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)来转义一个string的内容,以便它没有准备完整的SQL语句有效。

这不是用一个简单的\? 所以,你的单引号是''。

实际上,最简单的方法是用单引号(')replace单引号(')。 您的查询将成为:

 insert into tname(foo) values ('one''s self'); 

说明 :SQLite提倡使用单引号(')而不是双引号(“)作为string分隔符,声称这是SQL标准所要求的(我无法证实这一点)SQLite也不同于其他所有SQL数据库I知道,因为它使用''而不是'',再次声明SQL标准(再次,我无法证实这一说法)。

就我个人而言,我倾向于不同意这种说法,因为我知道的每个其他SQL数据库都使用C转义字符和反斜杠的方式。 即使它被写成在ISO的SQL标准的某个地方使用,我认为最好修改这个标准来使用C的方式,因为在实践中它已经是标准了。

请注意:

 insert into tname(foo) values ('ones "self"'); 

是该逻辑的有效sql语句,不需要额外的转义。