这是我要插入值的表格:
" create table if not exists "+CipherCongfigTable +
" ( DATABSE_NAME **TEXT** PRIMARY KEY NOT NULL,DATABSE_KEY **TEXT** NOT NULL);";
当我想插入
时String **configDBPassword**= "**x\'2DD29CA89\'**"
通过陈述
"insert into "+CipherCongfigTable+ " values("+DataBaseName+","+**configDBPassword**+")"
我得到例外:
无法识别的令牌:“\”:
我需要相同格式的密码,即具有转义字符。有什么办法可以吗????
由于
答案 0 :(得分:1)
不要在Android(或任何其他数据库包装器)上手动构建INSERT
(或任何其他,如果可以避免的话)查询,只要有预定义的API来获取您想要的内容。它打开了你的应用程序来引用问题,例如你问题中的问题,以及 - 最糟糕的 - 来自应用程序外部的SQL注入攻击。
例如,设置configDBPassword = "\"; DROP TABLE <tablename>; --"
只要用户可以输入configDBPassword
,我就可能对您的数据库造成严重破坏。
此外,SQLite使用双引号("
),反引号(`
,借用MySQL)或方括号([]
,借用MS SQL)来引用标识符(例如,其中包含空格的列或表名),字符串文字使用单引号('
)进行规范引用。 SQLite在允许混合两种引用类型方面是相当自由的,但是在适当的时候使用适当的引用样式更具可读性。来自the documentation:
警告程序员不要使用前面的项目符号中描述的两个例外情况。我们强调它们的存在只是为了使旧的和格式错误的SQL语句能够正确运行。 SQLite的未来版本可能会引发错误,而不是接受上述异常所涵盖的格式错误的语句。
事实上,你应该尽可能避免自己做引用。要插入值,请使用SQLiteDatabase.insert()
,这是在Android上的SQLiteDatabase
插入值的正确方法。它也正确地引用了这些论点:
db.beginTransaction();
try {
final ContentValues values = new ContentValues();
values.put("DATABSE_NAME", DataBaseName);
values.put("DATABSE_KEY", configDBPassword);
db.insert(CipherCongfigTable, null, values);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
始终正确引用您的SQL参数。
答案 1 :(得分:0)
试试这个。
"INSERT INTO "+CipherCongfigTable+ " values('DataBaseName','configDBPassword')”
您没有在插入查询中添加单引号(&#39;)
修改: 如果你需要插入单个qotes的字符串意味着在插入之前使用这样的。
configDBPassword = configDBPassword.replace ("'", "''");
同时更改**
" create table if not exists "+CipherCongfigTable +
" ( DATABSE_NAME TEXT PRIMARY KEY NOT NULL,DATABSE_KEY TEXT NOT NULL);";