当我在模拟器和USB连接设备上运行我的应用程序时,我得到了这个奇怪的异常。我可以看到shell中的表,但是当我尝试从Activity acton插入一条记录时,我得到了这个例外:
android.database.sqlite.SQLiteException:表音频没有名为“已下载”的列
我主要使用Android 1.5在模拟器上运行。我的代码的主要部分与本教程相关联 - http://www.devx.com/wireless/Article/40842/1954。
这是我使用的创建语句:
private static final String DATABASE_CREATE =
"create table audios ( _id integer primary key autoincrement, "
+ "user_name text not null, title text not null, file_path text not null, download integer not null, "
+ "created_at integer not null, downloaded_at integer not null );";
这是我使用的插入代码:
//--- insert a title into the database ---
public long insertTitle(String user_name, String title, String file_path, Integer downloaded, long created_at, String downloaded_at ) {
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_USER_NAME, user_name);
initialValues.put(KEY_TITLE, title);
initialValues.put(KEY_FILE, file_path);
initialValues.put(KEY_DOWNLOADED, downloaded);
initialValues.put(KEY_CREATED_AT, created_at);
initialValues.put(KEY_DOWNLOADED_AT, downloaded_at);
return db.insert(DATABASE_TABLE, null, initialValues);
}
答案 0 :(得分:2)
我会猜测你的代码中有这个:
public static final String KEY_DOWNLOADED = "downloaded";
错误消息的原因是......
表音频没有名为“已下载”的列
真。它没有,就像错误信息所说的那样。
如果您重新阅读表创建SQL,您会注意到列名实际上是download
,而不是download
ed 。
因此,请更正代码以使用正确的列名,然后设置。请注意,更正代码可能意味着:
downloaded
,而不仅仅是download
。我个人会选择这个,除非你有很多其他代码已经使用download
,因为我认为download
或a download
是to download
,而不是{{1}但它确实取决于它的实际含义答案 1 :(得分:0)
如果您之前创建没有此列的表,然后添加此列,只需修改数据库版本,eclipse将删除旧数据库并创建新数据库。
答案 2 :(得分:0)
我的情况稍有不同,但错误信息是一样的。 “表xxx hax没有列名为yyy”。我在这里回答所以,如果有人也“在屏幕上盯着洞”可能会找到一个提示。 如果您使用这样的占位符定义表:
private static final String SQL_CREATE_VISITA = String.format("CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT, %s %s, %s %s, %s %s, %s %s, %s %s, %s %s)",
TableVisit.NAME,
TableVisit.COL_NR_VISITA,
TableVisit.COL_TP_CASA,
FIELD_TEXT,
TableVisit.COL_NR_CASA,
FIELD_INTEGER,
TableVisit.COL_BENS_MOVEIS,
FIELD_INTEGER,
TableVisit.COL_DT_VISITA,
FIELD_TEXT,
TableVisit.COL_NR_COMODOS,
FIELD_INTEGER,
TableVisit.COL_NR_ISENCAO,
FIELD_INTEGER,
TableVisit.COL_NR_QUARTOS,
FIELD_INTEGER
);
始终仔细计算您的占位符。如果您错过了2,就像在此示例代码中一样,在添加另一个字段时,可能会创建表,只有在您尝试向表中插入新记录时才会提到错误。 (我的第一个答案是,所以任何评论都非常受欢迎。)