【问题标题】:Android & SQLite: "Table audios has no column named downloaded"Android & SQLite:“表音频没有名为下载的列”
【发布时间】:2010-05-06 03:47:21
【问题描述】:

当我在模拟器和 USB 连接设备上运行我的应用程序时,我得到了这个奇怪的异常。我可以在 shell 中看到表格,但是当我尝试从 Activity 操作插入记录时,我得到了这个异常:

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);
 }

【问题讨论】:

  • 请不要删除 StackOverflow 上的问题,除非它们是错误的或类似的。这是一个完全有效的问题。但是,如果您仍然希望将其删除,并且自己没有删除操作(如果您从一开始就没有针对自己的问题,我不知道它会出现在哪个代表处),请在此处留下另一条评论有人可能会为你做这件事。
  • 是的,这是一个彻底的错误,应该保留。当您发布您的答案时,我从另一个地方得到它,并且感觉很糟糕并且不想让人们花时间在它上面。我的愚蠢举动。 :-(它应该作为你看不到森林的树木的那些日子的纪念碑。:-)
  • 另外,下次其他人有类似的错误消息并搜索它时,他们会找到您的问题,并在此处发布答案,并会像您一样拍他们的额头。因此,即使答案对您没有帮助,因为您在我在这里发布之前自己发现了它,它可能会使其他在类似屏幕上盯着屏幕上的洞太久的人受益。我自己也有,你看看你刚刚知道正确的代码,但仍然给出错误,直到有人指出“呃,你为什么在这里使用错误的变量?”。

标签: android exception sqlite


【解决方案1】:

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

public static final String KEY_DOWNLOADED = "downloaded";

错误信息的原因是……

table audios没有名为downloaded的列

真的。没有,正如错误消息所说的那样。

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

因此,请更正您的代码以使用正确的列名,您应该已设置好。请注意,更正代码可能意味着:

  1. 将表中的列名更改为downloaded 而不仅仅是download。我个人会选择这个,除非你有很多其他代码已经在使用download,因为我认为download要么是a download要么to download,而不是has been downloaded,但这真的取决于它的实际情况意义
  2. 将访问表的 SQL 中的列名更改为使用与表相同的列名

【讨论】:

  • 正要发布这个。不错的拉塞。
  • 是的,我是个白痴。我现在会羞愧地去某个地方躲起来。 :-)
  • ....我错过了答案并删除了问题。 :-(现在我是一个双重白痴。:-)
  • 我已将其回滚,如果您仍希望将其删除,请在我的下方就您的问题发表评论。然而,这是一个完全有效的问题,尽管它也是谦逊的一课:) 另外,如果你觉得,你应该接受我的回答(或者最好等一下,看看其他人是否发布了更好的答案并接受他们的)回答了你的问题(或让你走上正轨)。这会回馈社区,并且及时也会使您受益。
【解决方案2】:

如果之前创建的表没有此列,然后添加此列,只需修改数据库版本,eclipse会删除旧数据库并创建新数据库。

【讨论】:

    【解决方案3】:

    我的情况有点不同,但错误信息是一样的。 “表 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,就像在此示例代码中一样,当添加另一个字段时,可能会创建表,并给出仅在您尝试向表中插入新记录时提到的消息错误。 (我在这里的第一个答案,所以任何评论都非常受欢迎。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多