Android& SQLite:“表音频没有名为”已下载的列“

时间:2010-05-06 03:47:21

标签: android exception sqlite

当我在模拟器和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);
 }

3 个答案:

答案 0 :(得分:2)

我会猜测你的代码中有这个:

public static final String KEY_DOWNLOADED = "downloaded";

错误消息的原因是......

  

表音频没有名为“已下载”的列

真。它没有,就像错误信息所说的那样。

如果您重新阅读表创建SQL,您会注意到列名实际上是download,而不是download ed

因此,请更正代码以使用正确的列名,然后设置。请注意,更正代码可能意味着:

  1. 将表格中的列名更改为downloaded,而不仅仅是download。我个人会选择这个,除非你有很多其他代码已经使用download,因为我认为downloada downloadto download,而不是{{1}但它确实取决于它的实际含义
  2. 更改访问表的SQL中的列名,以使用与表
  3. 相同的列名

答案 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,就像在此示例代码中一样,在添加另一个字段时,可能会创建表,只有在您尝试向表中插入新记录时才会提到错误。 (我的第一个答案是,所以任何评论都非常受欢迎。)