5

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);
}

这是我的日志:

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)
4

3 回答 3

15

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

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

注意“apikey”周围的`标记

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

于 2013-10-11T17:32:49.390 回答
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);
}
于 2013-10-14T10:21:35.100 回答
5

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

于 2013-10-11T17:34:28.267 回答