Ошибка приложения при запуске из-за java.lang.IllegalArgumentException: column '_id' не существует

Всякий раз, когда я запускаю свое приложение, я получаю java.lang.IllegalArgumentException: column '_id' does not exist ошибки в моем LogCat. Я создал столбец '_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: column '_id' не существует"

У меня была аналогичная проблема – я думаю, что это случай, когда нужно «выбрать» (или «выбрать как») нечто, называемое _id потому что SimpleCursorAdapter нужен SimpleCursorAdapter .

Из документации :

Обработка идентификаторов URI контента

По соглашению поставщики предлагают доступ к одной строке в таблице, принимая URI контента с идентификационным значением для строки в конце URI. Также по соглашению поставщики соответствуют значению _ID столбцу _ID таблицы и выполняют запрошенный доступ к соответствующей строке.

Это соглашение облегчает общую схему проектирования приложений, обращающихся к поставщику. Приложение выполняет запрос к провайдеру и отображает полученный Cursor в ListView с помощью CursorAdapter . Для определения CursorAdapter требуется, чтобы один из столбцов в Cursor был _ID .

В моем случае у меня есть столбец autonumber в моей таблице с именем «oid», поэтому я изменил команду SELECT (например) …

 SELECT oid as _id, name, number FROM mytable 

Это вызвало у меня проблему.

EDIT, чтобы показать более обширный код …

 @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(); 

О, мой плохой, вы только что указали свое имя переменной с помощью Uppercase D, это не рекомендуется и стандартный стиль java-кодирования.

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