Android - SQLite 没有这样的列,传递的列被忽略

Android - SQLite no such column, passed columns are ignored

答案:字符串字段需要用 ' ' 单引号括起来

我一直收到消息 "no such column: value (code 1)",但不明白为什么。

我正在尝试存储带有索引的人,这样我就可以唯一地识别他们并检索不需要作为 json 查询的更复杂的数据,为此我使用 Gson 来回转换 Json来自对象。

编辑了创建查询以显示正在运行的 UNIQUE 函数。 Here you can find more information about ON CONFLICT keywords

//Creation query
private static final String CREATE_PERSON_TABLE = "CREATE TABLE IF NOT EXISTS
    "+PERSON_TABLE_NAME+" (id INTEGER PRIMARY KEY, firstname VARCHAR, lastname VARCHAR,
    zipcode VARCHAR, birthdate VARCHAR, json VARCHAR,
    UNIQUE(lastname, zipcode, birthdate) ON CONFLICT REPLACE);";

//Insert or replace query execution
getWritableDatabase().execSQL("INSERT OR REPLACE INTO "+PERSON_TABLE_NAME+"
(firstname, lastname, zipcode, birthdate, json) VALUES 
("+person.getFirstname()+","+person.getLastName()+","+person.getZipcode()+",
'"+person.getBirthdate+"','"+person.getLifestoryJson()+"')");

堆栈跟踪

android.database.sqlite.SQLiteException: no such column: Hank (code 1): , while compiling: INSERT OR REPLACE INTO person (firstname, 
lastname, zipcode, birthdate, json) VALUES (Hank,Hairy,8888HH,'06-01-1966','{"events":"[]","comments":[],"storyList":[],"favoriteFoods":"cheddar","peperoni":"lasagna"}')
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1663)
            at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1594)

几个小时以来,我一直在盯着教程并与教程进行比较,只是看不出哪里出了问题。似乎由于某种原因,我传递的列被忽略了,而这些值被用作列。非常感谢任何关于导致此错误的原因的帮助或解释。

字符串需要用引号括起来:

getWritableDatabase().execSQL("INSERT OR REPLACE INTO "+PERSON_TABLE_NAME+"
(firstname, lastname, zipcode, birthdate, json) VALUES 
('"+person.getFirstname()+"','"+person.getLastName()+"','"+person.getZipcode()+",
'"+person.getBirthdate+"','"+person.getLifestoryJson()+"')");

你以某种方式包装了日期、生平,但没有包装名字、姓氏和邮政编码。

我不知道这是否与您的问题有关,但对于 SQLite,我相信允许的数据类型是:

整数、文本、BLOB、实数和数字

所以您的创建 table 语句 可能 会导致一些问题。

这是一个不同的 create table 语句:

CREATE TABLE 'person_table_name' (
    'id'            INTEGER,
    'first_name'    TEXT,
    'last_name'     TEXT,
    'zipcode'       TEXT,
    'birthdate'     TEXT,
    'json'          TEXT,
    PRIMARY KEY(id)
);

您创建的唯一索引可能会更改为:

CREATE UNIQUE INDEX 
person_unique 
ON 
person_table_name (first_name, last_name, zipcode, birthdate);

您的插入或替换语句可能会更改为:

INSERT OR REPLACE INTO 
person_table_name (first_name, last_name, zipcode, birthdate, json) 
VALUES (
    'Hank', 
    'Hairy',
    '8888HH',
    '06-01-1966',
    '{"events":"[]","comments":[],"storyList":[],"favoriteFoods":"cheddar","peperoni":"lasagna"}'
);

我使用了"DB Browser for SQLite"(创建数据库和测试sqlite语句等的小程序)

以上语句全部执行成功

我认为根据您的具体情况,您需要针对您的具体陈述更改以下内容:

getWritableDatabase().execSQL("INSERT OR REPLACE INTO " +
PERSON_TABLE_NAME + "(firstname, lastname, zipcode, birthdate, json) +
VALUES ('" + person.getFirstname() + "','" + person.getLastName() + "','" + person.getZipcode() + "','" + person.getBirthdate + "','" + person.getLifestoryJson() + "')");

看来您在 person.getFirstName() 和 person.getLAstName() 方法调用周围没有 '(单引号)