我试图用一些代码来解决为什么我昨天得到这个错误的问题:
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()中我可以做到这一点。只要我不包括哪些条款,我不是。任何帮助非常感谢。
答案 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);
}