SQLite(特别是Android) - "in"是一个有效的列名吗?



我花了 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实际上不是一个非常描述性的列名称。根据它实际应该代表的内容(而且我不能立即判断这一事实证明它没有足够的描述性),你想把它改成 checkedInTimeisInLibrary 之类的东西。

是的,"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方式,但它确实接受'(反引号))

谢谢大家。

相关内容

最新更新