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

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】
歡迎評論,就當支持開源哦!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章