Как создать представление списка, содержащее данные из sqlite в android

Я пытаюсь отобразить данные из базы данных SQLite в файле ListView. Я использую CursorAdapter для прямого подключения Cursor к ListView, но по какой-то причине я всегда получаю исключение. Это моя модифицированная активность DBadapter:

public static final String ID="_id";

    public Cursor feching_Data(){

            String[] columns = {ID,USER_NAME,USER_PASSWORD};
            db = dbHelper.getWritableDatabase();
            Cursor cursor = db.query(TABLE_NAME, columns,null,null,null,null,null);
            return cursor;

        }

Здесь я устанавливаю SimpleCursorAdapter:

public static final String ID="_id";
    String[] from = {logindatabase_adapter.USER_NAME,logindatabase_adapter.USER_PASSWORD};
    int[] to = {R.id.txt_username,R.id.txt_pasword};
    Cursor cursor = logindatabase_adapter.feching_Data();
    cursoradapter = new SimpleCursorAdapter(DatabaseListView.this, R.layout.listcell, cursor, from, to);
    database_results.setAdapter(cursoradapter);

И это исключение, которое я получаю:

FATAL EXCEPTION: main
   Process: com.developer.milanandroid, PID: 5109
   java.lang.IllegalArgumentException: column '_id' does not exist
    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:303)
    at android.widget.CursorAdapter.init(CursorAdapter.java:172)
    at android.widget.CursorAdapter.<init>(CursorAdapter.java:120)
    at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:52)
    at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:78)
    at com.developer.milanandroid.DatabaseListView$1.onClick(DatabaseListView.java:50)
    at android.view.View.performClick(View.java:4438)
    at android.view.View.onKeyUp(View.java:8241)
    at android.widget.TextView.onKeyUp(TextView.java:5682)
    at android.view.KeyEvent.dispatch(KeyEvent.java:2664)
    at android.view.View.dispatchKeyEvent(View.java:7665)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2035)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1505)
    at android.app.Activity.dispatchKeyEvent(Activity.java:2418)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
    at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
    at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
    at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
    at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
    at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
    at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:138)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)

person dEePU    schedule 05.05.2015    source источник


Ответы (2)


Просто посмотрите на logcat, источник ошибки объясняется прямо во второй строке:

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

В вашей таблице нет столбца _id, но для CursorAdapter требуется наличие столбца _id (как объясняется в документах прямо здесь).


Решение в вашем случае простое: у вас уже есть столбец id, но он называется ID. Переименуйте его в _id и все должно работать нормально!

Обратите внимание, что вам, вероятно, придется переустановить приложение, чтобы изменения в столбцах и/или таблицах вступили в силу!

person Xaver Kapeller    schedule 05.05.2015
comment
я заменил свой идентификатор на _id, но он не работает, чувак. снова происходит то же самое, пожалуйста, помоги мне, чувак @Xaver Kapeller - person dEePU; 05.05.2015
comment
Вы переустанавливали приложение? И под переустановкой я имею в виду полностью деинсталлировать его с устройства, а затем снова развернуть? - person Xaver Kapeller; 05.05.2015
comment
Нет, чувак, я только что развернул его снова, только проверю, удалив - person dEePU; 05.05.2015
comment
А вы уверены, что это та же ошибка? А вы уверены, что действительно починили? - person Xaver Kapeller; 05.05.2015
comment
Я могу гарантировать вам, что если в этой таблице есть столбец _id, она будет работать. Вы, должно быть, делаете что-то еще неправильно. Перепроверьте свою реализацию. - person Xaver Kapeller; 05.05.2015
comment
Да, замена чувака на _id работает нормально, и я не вижу список после нажатия кнопки. Я опубликовал измененный код действия выше, пожалуйста, проверьте его. - person dEePU; 05.05.2015
comment
@lakshmansundeep Не делай этого. Если у вас возникла новая проблема, задайте новый вопрос. По одному вопросу на каждую тему. Если эта проблема — проблема с _id — решена, примите ответ, который помог вам больше всего, также проголосуйте, если можете, а затем задайте новый вопрос. - person Xaver Kapeller; 05.05.2015
comment
Но у меня нет такого рейтинга на моем аккаунте, чувак, поэтому я и спросил тебя. Спасибо за терпеливый ответ и за ваш ценный ответ @Xaver Kapeller - person dEePU; 05.05.2015

Вместо переименования в _id другой способ заключается в том, что в запросе вы можете выбрать ID как _id

На него уже ответили в SO.

  1. Android: столбец '_id' не существует
  2. Столбец Android '_id' не существует?
  3. О поле «_id» в Android SQLite
person Bharatesh    schedule 05.05.2015
comment
Если вы пишете ответ, он должен быть полностью автономным. Теперь в контексте текст Вместо переименования в _id... имеет смысл, но люди, которые ищут ответ на вопрос, этого не поймут. Они только собираются думать переименовать что?. - person Xaver Kapeller; 05.05.2015