SQLiteException:无法识别的标记:“\”:

时间:2015-07-21 06:48:46

标签: android sqlite

这是我要插入值的表格:

" 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**+")"

我得到例外:

  

无法识别的令牌:“\”:

我需要相同格式的密码,即具有转义字符。有什么办法可以吗????

由于

2 个答案:

答案 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);";