在Android数据库插入语句中用双引号替换单引号

时间:2014-03-20 11:52:51

标签: java android sqlite

假设我有一个这样的execquery语句:

db1.execSQL("insert into "+TABLE_NAME+" values('"name"')");

其中name是包含撇号的字符串变量。例如:

name = "tom's database";

在这种情况下,我在此语句附近得到一个SQLITEexception。我确信这是因为单引号。

如何对此进行修改,使得该语句不会导致崩溃,并且名称会在单引号中保存在db中?

我在网上看到,每一个这样的单引号都必须以另一个单引号作为前缀。

有人可以提供相同的代码吗?

4 个答案:

答案 0 :(得分:3)

转义字符串文字中的特殊字符,但通常它是一种容易出错的方法。最好使用?占位符和绑定参数,如下所示:

db1.execSQL("INSERT INTO " + TABLE_NAME + " VALUES (?)", new String[] { name });

或使用insert()ContentValues基本相同。

答案 1 :(得分:2)

重复的问题。查看How to escape unsupported character in SQLite on Android?

使用

String escapedName = DatabaseUtils.sqlEscapeString(name);
db1.execSQL("insert into "+TABLE_NAME+" values('" + escapedName + "')");

请参阅http://developer.android.com/reference/android/database/DatabaseUtils.html#sqlEscapeString%28java.lang.String%29

答案 2 :(得分:2)

你忘了:

  1. 将字符串撇号加倍(因为撇号是SQL字符串分隔符)。
  2. 在INSERT字符串中添加+以正确添加变量。
  3. 因此,我将上述INSERT语句更改为:

    db1.execSQL("INSERT INTO " + TABLE_NAME + " VALUES ('" + name.replace("'", "''") + "')");
    

答案 3 :(得分:2)

您可以使用“PrepareStatement”来避免问题

SQLiteStatement p = db1.compileStatement("insert into "+TABLE_NAME+" values(?)");
p.bindString(1, name);
p.execute();

其他形式:

ContentValues values = new ContentValues();
values.put("name", name);
db1.insert(TABLE_NAME, null, values);