当我只尝试从表中查询一列时,为什么我得到_id不存在错误?

时间:2012-06-03 13:41:30

标签: android sqliteopenhelper

我试图用一些代码来解决为什么我昨天得到这个错误的问题:

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()中我可以做到这一点。只要我不包括哪些条款,我不是。任何帮助非常感谢。

4 个答案:

答案 0 :(得分:2)

让我们调用这些event光标:

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

...和*光标:

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

您收到的大多数答案(即使是这里的答案:In Android, does _id have to be present in any table created?)都在猜测可能导致错误的原因。我想我也会回答你的问题:

  

任何理由为什么(前者崩溃,后者是桃子?)

*event游标之间的区别在于*隐式选择每个列,而event仅选择{{1} }}。在event_name表中,events光标相当于:

*

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

SELECT _id, event_name FROM events;

因为您隐含地使用java.lang.IllegalArgumentException: column '_id' does not exist 选择_id列。

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

  

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

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

话虽如此,如果这仍然对您的应用程序似乎无效或没有意义,请在您使用Cursor的地方发布代码并抛出错误。

答案 1 :(得分:1)

我怀疑无论处理游标是什么,都试图获取_ID列,但是没有在select语句中指定。做点什么,

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

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

答案 2 :(得分:1)

  

java.lang.IllegalArgumentException:列'_id'不存在

我遇到同样的问题,抛出此异常是因为SimpleCursorAdapter需要名为SELECT的{​​{1}}列,因此您可以解决此问题,例如,如果您创建了一些列为{{1}的表作为PK所以你可以这样试试:

_id

答案 3 :(得分: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);
}