Ошибка при заполнении ListView из базы данных SQL с помощью SimpleCursorAdapter - PullRequest
0 голосов
/ 01 июня 2018

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

У меня возникли некоторые проблемы с заполнением.Мне нужно использовать SimpleCursorAdapter для этой программы (как задание из моего университета)

Это моя заполненная функция, которая находится внутри моей MainActivity

 private void populate(){
    Cursor cursor = myDb.getAllRows();
    String[] backDB = new String[] {DBAdapter.COLUMN_NAME, DBAdapter.COLUMN_DATE};
    int[] toView = new int[] {R.id.textViewName, R.id.textViewDate};
    SimpleCursorAdapter myCursor;
    myCursor = new SimpleCursorAdapter(getBaseContext(), R.layout.row_layout, cursor, backDB,toView, 0);
    ListView myList = (ListView) findViewById(R.id.listViewTasks);
    myList.setAdapter(myCursor);
}

Я думаю, что это может быть связано с SQLбаза данных, особенно функция getAllRows, потому что в logcat я вижу, что есть проблема со строкой:

 myCursor = new SimpleCursorAdapter(getBaseContext(), R.layout.row_layout, cursor, backDB,toView, 0); 

Итак, вот моя функция getAllRows

 public Cursor getAllRows() {
    String query = "SELECT * FROM " + TABLE_NAME;
    Cursor c = db.rawQuery(query, null);
    c.moveToFirst();
    return c;
}

Моя программа просто падает и сохраняетсбой между прочим.

1 Ответ

0 голосов
/ 07 июня 2018

При догадке ваша проблема связана с тем, что у вас нет столбца с именем _id , и в этом случае журнал будет содержать что-то вроде: -

06-07 10:53:53.957 1178-1178/so50635292.so50635292 E/AndroidRuntime: FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{so50635292.so50635292/so50635292.so50635292.MainActivity}: java.lang.IllegalArgumentException: column '_id' does not exist
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
        at android.app.ActivityThread.access$600(ActivityThread.java:130)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4745)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalArgumentException: column '_id' does not exist
        at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:302)
        at android.widget.CursorAdapter.init(CursorAdapter.java:168)
        at android.widget.CursorAdapter.<init>(CursorAdapter.java:145)
        at android.widget.ResourceCursorAdapter.<init>(ResourceCursorAdapter.java:91)
        at android.widget.SimpleCursorAdapter.<init>(SimpleCursorAdapter.java:104)
        at so50635292.so50635292.MainActivity.populate(MainActivity.java:31)
        at so50635292.so50635292.MainActivity.onCreate(MainActivity.java:23)
        at android.app.Activity.performCreate(Activity.java:5008)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
        at android.app.ActivityThread.access$600(ActivityThread.java:130) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loop(Looper.java:137) 
        at android.app.ActivityThread.main(ActivityThread.java:4745) 
        at java.lang.reflect.Method.invokeNative(Native Method) 
        at java.lang.reflect.Method.invoke(Method.java:511) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
        at dalvik.system.NativeStart.main(Native Method) 

Соответствующей деталью является java.lang.IllegalArgumentException: column '_id' does not exist

. Для адаптеров курсора требуется этот столбец, а также псевдоним rowid.Псевдоним строки - это столбец, который определен как ?? INTEGER PRIMARY KEY, также может быть закодировано необязательное ключевое слово AUTOINCREMENT.Однако, как правило, этого не следует делать, так как существуют накладные расходы на кодирование AUTO INCREMENT.

Чтобы устранить эту проблему, можно добавить столбец в таблицу create sql в методе onCreate DBAdapter, а затем удалить данные приложения илиудаление приложения, а затем повторный запуск приложения.

Можно также создать псевдоним при запросе данных, изменив значение

 String query = "SELECT * FROM " + TABLE_NAME;

на

String query = "SELECT rowid AS _id,* FROM " + TABLE_NAME;
  • Обратите внимание, что предполагается, что вы не закодировали БЕЗ ROWID
...