由于java.lang.IllegalArgumentException,应用程序在启动时崩溃:列'_id'不存在

每当我启动我的应用程序,我得到一个java.lang.IllegalArgumentException: column '_id' does not exist我的LogCat错误。 我已经创build了'_id'列,但仍然抛出这个。 这里是我的主要.java:

 package com.gantt.shoppinglist; import android.app.Dialog; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class ShoppingList extends ListActivity { private DataHelper DataHelper; /** Called when the activity is first created. */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DataHelper = new DataHelper(this); Cursor c = (Cursor) DataHelper.selectAll(); long id = c.getLong(c.getColumnIndex("_id")); startManagingCursor(c); ListView lv = (ListView) findViewById(android.R.id.list); String[] from = new String[] { com.gantt.shoppinglist.DataHelper.getDatabaseName() }; int[] to = new int[] { android.R.id.text1 }; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, c, from, to); lv.setAdapter(adapter); Button button1main = (Button) findViewById(R.id.add); button1main.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final Dialog additem = new Dialog(ShoppingList.this); additem.setContentView(R.layout.maindialog); final EditText et = (EditText)additem.findViewById(R.id.edittext); additem.setTitle("Type your item"); additem.setCancelable(true); et.setHint("Type the name of an item..."); Button button = (Button) additem.findViewById(R.id.cancel); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { additem.dismiss(); } }); additem.show(); Button ok = (Button) additem.findViewById(R.id.ok); ok.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { final String text = et.getText().toString(); additem.dismiss(); et.setText(""); } }); } }); } } 

这是我的DataHelper类:

 package com.gantt.shoppinglist; import java.util.ArrayList; import java.util.List; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteStatement; import android.util.Log; public class DataHelper { private static final String DATABASE_NAME = "items.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "table1"; public static final String KEY_ROWID = "_id"; private Context context; private SQLiteDatabase db; private SQLiteStatement insertStmt; private static final String INSERT = "insert into " + TABLE_NAME + "(name) values (?)"; public DataHelper(Context context) { this.context = context; OpenHelper openHelper = new OpenHelper(this.context); this.db = openHelper.getWritableDatabase(); this.insertStmt = this.db.compileStatement(INSERT); } public long insert(String name) { this.insertStmt.bindString(1, name); return this.insertStmt.executeInsert(); } public void deleteAll() { this.db.delete(TABLE_NAME, null, null); } public Cursor selectAll() { List<String> list = new ArrayList<String>(); Cursor cursor = this.db.query(TABLE_NAME, new String[] { "name" }, null, null, null, null, "name desc"); if (cursor.moveToFirst()) { do { list.add(cursor.getString(0)); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return cursor; } public static String getDatabaseName() { return DATABASE_NAME; } private static class OpenHelper extends SQLiteOpenHelper { OpenHelper(Context context) { super(context, getDatabaseName(), null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w("Example", "Upgrading database, this will drop tables and recreate."); db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } } } 

Solutions Collecting From Web of "由于java.lang.IllegalArgumentException,应用程序在启动时崩溃:列'_id'不存在"

我有一个类似的问题 – 我认为这是一个“select”(或“select”)的情况下称为_id因为SimpleCursorAdapter需要它。

从文档 :

处理内容URI ID

按照惯例,提供者通过接受URI末尾行的ID值的内容URI来访问表中的单个行。 同样按照惯例,提供者将ID值匹配到表的_ID列,并对匹配的行执行请求的访问。

这个约定有助于访问提供者的应用程序的通用devise模式。 该应用程序对提供程序执行查询,并使用CursorAdapter将生成的Cursor显示在ListViewCursorAdapter的定义要求Cursor中的一列是_ID

在我的情况下,我有一个名为'oid'的表中的自动编号列,所以我改变了我的SELECT命令是(例如)…

 SELECT oid as _id, name, number FROM mytable 

这为我解决了这个问题。

编辑显示更广泛的代码…

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.channel_selector); GridView channel_selector_grid = (GridView) findViewById(R.id.channel_grid); sca = getGuideAdapter(); channel_selector_grid.setAdapter(sca); } public SimpleCursorAdapter getGuideAdapter() { SimpleCursorAdapter adapter = null; SQLiteDatabase db = SQLiteDatabaseHelper.getReadableDatabase(); Cursor cursor = db.rawQuery("SELECT DISTINCT oid as _id, name, number FROM CHAN_TABLE ORDER BY number", null); if (cursor.moveToFirst()) { String[] columnNames = { "name" }; int[] resIds = { R.id.channel_name }; adapter = new SimpleCursorAdapter(this, R.layout.channel_selector_item, cursor, columnNames, resIds); } return adapter; } 

不知道你是不是把它粘贴错了,但是:

  DataHelper = new DataHelper(this); Cursor c = (Cursor) DataHelper.selectAll(); 

是错的。 您需要将其声明为对象,并在初始化的DataBase对象上调用您的方法:

  DataHelper dataHelper = new DataHelper(this); Cursor c = (Cursor) dataHelper.selectAll(); 

哦,我的坏你只是用大写字母D声明你的variables名,这不build议,也不是标准的Java编码风格。

http://java.about.com/od/javasyntax/a/nameconventions.htm