0

我试图用一些代码解决昨天为什么会出现此错误的问题:

java.lang.IllegalArgumentException: column '_id' does not exist

我有更多的代码,尤其是我不需要的,所以我去掉了很多代码,以便更容易理解我哪里出错了。但本质上这是我的架构:

database.execSQL("CREATE TABLE events (" +
                "_id INTEGER PRIMARY KEY, event_name TEXT" +
                ")");

可以说,看起来不错。除非我忘记阅读,否则它显然就在那里。但后来我弄清楚了我的错误来自哪里,或者至少我确定这就是原因。检索游标的这段代码:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT event_name FROM events", null);
}

根据android,这是错误。当我将其更改为:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT * FROM events", null);
}

一切都是桃色的。当前者时,它会崩溃。关于为什么会这样的任何原因。我认为在 rawQuery() 中我可以做到这一点。只要我不包括 where 子句,我就没有。非常感谢任何帮助。

4

4 回答 4

2

让我们称之为event游标:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT event_name FROM events", null);
}

...和*光标:

public Cursor getEventsName() {
    return database.rawQuery( "SELECT * FROM events", null);
}

您收到的大多数答案(甚至是这里的答案:在 Android 中,是否 _id 必须出现在任何创建的表中?)都在猜测您的错误的可能原因。我想我也会回答你的问题:

任何原因(前者崩溃,后者是桃色?)

*event游标之间的区别在于隐式*选择每一列并且event只选择event_name。在您的events表中,*光标相当于:

SELECT _id, event_name FROM events;

这就是为什么这个光标工作得很好。换句话说,您没有收到此错误:

java.lang.IllegalArgumentException: column '_id' does not exist

因为您正在隐式选择_id带有*.

当然,出现此错误的最可能原因是当您将数据与 ListView、Spinner 等绑定时;他们都倾向于使用某种形式的 CursorAdapter。这是来自CursorAdapter 文档

将数据从游标公开到 ListView 小部件的适配器。游标必须包含名为“_id”的列,否则此类将不起作用。

所以解决方案很简单:您必须选择_id查询中的列以及您想要的其他列。(编译器没有骗你。)

话虽如此,如果这对您的应用程序似乎仍然无效或没有意义,请在您使用光标的位置发布代码并引发错误。

于 2012-06-03T16:40:31.730 回答
1

我怀疑处理游标的任何东西都试图获取 _ID 列,但未在您的 select 语句中指定。做类似的事情,

public Cursor getEventsName() {
    return database.rawQuery( "SELECT _id, event_name FROM events", null);
}

一些 Android 组件,例如SimpleCursorAdapter要求_ID在 select 语句中可用,因为它在getItemId()调用时在内部使用。

于 2012-06-03T13:46:32.937 回答
1

java.lang.IllegalArgumentException:列“_id”不存在

我有同样的问题,抛出这个异常是因为SimpleCursorAdapter需要SELECT命名列_id,所以你可以解决它,例如,如果你创建了一些列KEY_ID作为 PK 的表,那么你可以像这样尝试:

SELECT KEY_ID AS _id, column1, column2 FROM SomeTable.
于 2012-06-03T13:56:59.693 回答
0
public Cursor getEventsName() {
return database.rawQuery( "SELECT * FROM events", null);

将其更改为

    public Cursor getEventsName(){

    final String[] columns = new String[]{"_id", "event_name "};
    return database.query(events, columns, ""   , null, null, null, null);
}
于 2012-06-03T14:41:25.477 回答