假设我有一个这样的execquery语句:
db1.execSQL("insert into "+TABLE_NAME+" values('"name"')");
其中name是包含撇号的字符串变量。例如:
name = "tom's database";
在这种情况下,我在此语句附近得到一个SQLITEexception。我确信这是因为单引号。
如何对此进行修改,使得该语句不会导致崩溃,并且名称会在单引号中保存在db中?
我在网上看到,每一个这样的单引号都必须以另一个单引号作为前缀。
有人可以提供相同的代码吗?
答案 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 + "')");
答案 2 :(得分:2)
你忘了:
因此,我将上述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);