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() 方法调用周围没有 '(单引号)
答案:字符串字段需要用 ' ' 单引号括起来
我一直收到消息 "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() 方法调用周围没有 '(单引号)