我花了 10 分钟检查拼写等,但我找不到错误!
所以我想知道 in
SQLite 中的有效列名吗?我通常使用 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
值。没有类型错误或静默异常。
没想到会有任何错误,我什至不确定出了什么问题。
IN 是一个关键字。如果你引用它,它应该有效:
INSERT INTO
Readings(state,time,reading,"in") VALUES (?,?,?,?)
中期,尝试更改该列名称。
in
实际上是一个SQL关键字,如下所示:
select xyzzy from plugh where grue in ('twisty','passages')
因此,如果你想使用它,你可能需要转义它,例如:
select xyzzy from plugh where `in` in ('yes','maybe')
我不确定这将如何转换为 Android 方法,但如果您使用更合适的列名,您就不会遇到这些问题。轻推,轻推,眨眼,眨眼。
对不起,仔细想想,这可能太迟钝了。我的意思是:in
实际上不是一个非常描述性的列名称。根据它实际应该代表的内容(而且我不能立即判断这一事实证明它没有足够的描述性),你想把它改成 checkedInTime
或 isInLibrary
之类的东西。
是的,"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方式,但它确实接受'(反引号))
谢谢大家。