2

我花了 10 分钟检查拼写等,但我找不到错误!

所以我想知道inSQLite 中的列名是有效的吗?我通常使用 MariaDB,并正确提供了一个转义/使用语句,通常一切都很好。

09-18 03:15:27.892: E/SQLiteLog(30043): (1) near "in": syntax error
09-18 03:15:27.892: E/SQLiteDatabase(30043): Error inserting state=1 time=1378810407
 reading=13964 in=0
09-18 03:15:27.892: E/SQLiteDatabase(30043): android.database.sqlite.SQLiteException:
 near "in": syntax error (code 1): , while compiling: INSERT INTO 
 Readings(state,time,reading,in) VALUES (?,?,?,?)

有帮助吗?

-- Describe READINGS
CREATE TABLE "Readings" (
    "id" INTEGER PRIMARY KEY AUTOINCREMENT,
    "reading" INTEGER,
    "in" INTEGER,
    "time" INTEGER,
    "state" INTEGER
)

采用:

ContentValues values = new ContentValues();
values.put("reading", reading.asInt());
values.put("in", in.asInt());
values.put("state",State.OKAY.ordinal());
values.put("time", time.getTimestamp());

return (int) db.insert("Readings", null, values);

in实际上是0;我有一大堆错误,其中一些具有不同的in值。没有类型错误或静默异常。

我没想到会出现任何错误,我什至不确定出了什么问题。

4

3 回答 3

2

IN 是一个关键字。如果您引用它,它应该可以工作:

INSERT INTO 
  Readings(state,time,reading,"in") VALUES (?,?,?,?)

中期,尝试更改该列名称。

于 2013-09-18T02:31:18.887 回答
1

in实际上是一个 SQL 关键字,如:

select xyzzy from plugh where grue in ('twisty','passages')

因此,如果您想使用它,您可能需要转义它,例如:

select xyzzy from plugh where `in` in ('yes','maybe')

我不确定这将如何转化为 Android 方法,但如果您使用更合适的列名,您将不会遇到这些问题。轻推,轻推,眨眼,眨眼。

抱歉,仔细想想,这可能太迟钝了。我的意思是:in实际上并不是一个非常具有描述性的列名。根据它实际应该代表的内容(事实上我不能立即告诉这一点证明它的描述性不够),你我想把它改成类似checkedInTimeor的东西isInLibrary

于 2013-09-18T02:31:56.020 回答
0

是的,“in”是一个关键字,要么 SQLite 不允许你完全绕过 SQL,要么 Android 的包装器太薄了,它不适合你。不管修复很简单:

    ContentValues values = new ContentValues();
    values.put("reading", reading.asInt());
    values.put("\"in\"", in.asInt());
    values.put("state",State.OKAY.ordinal());
    values.put("time", time.getTimestamp());

    return (int) db.insert("Readings", null, values);

是的,只需将引号放在那里(我理解是 SQLite 方式,但它确实接受`(反引号))

多谢你们。

于 2013-09-18T02:36:31.000 回答