android報錯: java.lang.IllegalArgumentException: column '_id' does not exist
使用Cursor相關的Adapter時須要一個自增的列,且名字必需爲 _id。
舉個特殊的例子:
--建立一張SQLite的表 (字段均大寫)
Create Table Test(_ID integer primary key autoincrement,NAME text,URL text,DESC text)
// XX類中的查詢方法
public Cursor query() {
return getReadableDatabase().query("Test", new String[] { "_ID as _id", "name", "desc", "url"}, null, null, null, null, null);
}
//Activity類中的一個普通展現方法
public void showListView() {
Cursor c = new XX().query();
/*
if (c.moveToFirst()) {
for (int i = 0; i < c.getCount(); i++) {
c.move(i);
Map map = new HashMap();
for (int j = 0; j < c.getColumnCount(); j++) {
map.put(c.getColumnNames()[j], c.getString(j));
}
System.out.println(map);
}
}
*/
String[] form = { "_id", "NAME", "URL", "DESC" };//
值得注意的是,這裏的_id必須小寫
int[] to = { R.id.txt0, R.id.txt1, R.id.txt2, R.id.txt3 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, c, form, to);
listView.setAdapter(adapter);
}
提醒:
1. 若是建立時_ID爲大寫,但後面須要採用適配器SimpleCursorAdapter直接展現ListView,要注意這裏的_id必須小寫。
另外String[] form = { "_id", "NAME", "URL", "DESC" };僅僅這裏小寫仍是不夠的,還要在查詢時採用as將_ID轉爲_id,如query()方法
2. 順便擴展下 getReadableDatabase().query("Test", new String[] { "_ID as _id", "name", "desc", "url"}, null, null, null, null, null);
你會發現,我明明將_ID、NAME、DESC、URL均轉化爲小寫,爲什麼只有_id是小寫
System.out.println(map);
打印效果格式爲(前提表裏有數據):
{URL=, _id=1, DESC=, NAME=}
{URL=2, _id=2, DESC=3, NAME=1}
緣由是,在查詢是列頭字段文本顯示的優先級:as 【_ID as _id】 > 默認列頭【_ID】 > 普通寫法【_id】
歡迎評論,就當支持開源哦!