Insert中的SQLite无法识别的令牌异常

时间:2013-10-11 17:25:37

标签: java android sqlite

当我尝试在我的插入查询中包含unrecognized token error列及其值时,我得到Api_key,否则,它会正常工作。

这是代码:

public void InsertResult(String apikey,String auditid,String crit_id, int current_chap)
{
    String s="INSERT OR IGNORE INTO Results(AuditID,CriteriaID,ChapterID,Api_key) VALUES("+auditid+","+crit_id+","+current_chap+","+apikey+")";

    sp.execSQL(s);
}

这是我的logcat:

10-11 22:45:09.655: E/AndroidRuntime(8124): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.oxtro.trustea/com.oxtro.trustea.ChapterActivity}: android.database.sqlite.SQLiteException: unrecognized token: "3249f6dc" (code 1): , while compiling: INSERT OR IGNORE INTO Results(AuditID,CriteriaID,ChapterID,Api_key) VALUES(1,13,13,3249f6dc-c3ca-4c8d-a4de-df1834c579c4)

3 个答案:

答案 0 :(得分:10)

你应该在非数字字符串周围加上刻度线。

String s="INSERT OR IGNORE INTO Results(AuditID,CriteriaID,ChapterID,Api_key) VALUES("+auditid+","+crit_id+","+current_chap+",`"+apikey+"`)";

注意“标记”apikey“

SQLite看到了-,并对它为什么不在字符串中感到困惑。

答案 1 :(得分:8)

不要在SQL语句中对字符串进行硬编码。

用户输入的字符串会产生SQL注入漏洞。

需要从特殊字符中解析任意字符串。

SQL API通常提供绑定方法,允许您在数据库中安装任意数据。

在Android SQLite中,对于INSERT,您可以使用:

public void InsertResult(String apikey,String auditid,String crit_id, int current_chap)
{
    ContentValues cv=new ContentValues();
    cv.put("AuditID", auditid);
    cv.put("CriteriaID", crit_id);
    cv.put("ChapterID", current_chap);
    cv.put("Api_key", apikey);
    sp.insert("Results", null, cv);
}

答案 2 :(得分:4)

Apikey是一个字符串,所以对于sql,你需要将它放在引号内。 String s="INSERT OR IGNORE INTO Results(AuditID,CriteriaID,ChapterID,Api_key) VALUES("+auditid+","+crit_id+","+current_chap+",'"+apikey+"')";