Android Studio - Курсор SQLite не возвращает никаких данных - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь вернуть имена отдельных значений в столбце «категория» базы данных SQLite. Кажется, что курсор не возвращает никаких результатов.

Я создаю приложение для Android, используя уже существующую базу данных видов птиц. Цель состоит в том, чтобы позволить пользователю исследовать базу данных через приложение. Проблема в том, что я пытаюсь вернуть различные категории видов птиц, которые существуют в базе данных. Похоже, что база данных открывается успешно - исключение SQLite не создается, но после использования запроса метод .moveToNext не возвращает никаких данных.

public ArrayList<String> getCategory(String[] name){
        String TABLE_BIRDS = "main";
        String[] COLUMN = name;
        ArrayList<String>categories = new ArrayList<>();

        if (name[0]!=null)
        {
            Log.d(LOG_TAG, name[0]);
        } else {
            Log.d(LOG_TAG, "name[0] has not been passed");
        }
        x = db.query(true, TABLE_BIRDS, new String[] { COLUMN[0] } , null, null, COLUMN[0], null, null, null );
        if (x.moveToNext()) {
            Log.i(LOG_TAG, x.getString(x.getColumnIndex("category")));
        }
        else {
            Log.i(LOG_TAG, "The cursor is not returning any data");
        }
        //Simple cursor loop
        if (x.moveToNext()){
            String category = new String();
            category = x.getString(x.getColumnIndex(category));
            categories.add(category);
            Log.i("cursor loop", category);
        }
        return categories;

В приведенном выше коде сообщения журнала показывают, что: getCategory получает ожидаемую строку «категория» перед запросом, но сразу после запроса цикл if / else сообщает, что «Курсор не возвращает никаких данных ».

Я ожидал, что запрос вернет шесть строк, цикл курсора добавит их в категории ArrayList, и этот ArrayList будет возвращен.

Пожалуйста, любая помощь будет оценена.

Ответы [ 2 ]

3 голосов
/ 09 июля 2019

Предполагая, что курсор не нулевой, вы должны итерируйте результаты с помощью цикла while / for.

например: while(x.moveToNext()) { //your logic }

Всегда полезно при отладке такого рода проблем установить браузер БД SQLite, а затем проверить запрос курсора к вашей БД , чтобы проверить, есть ли у вас какие-либо данные.

1 голос
/ 09 июля 2019

Вот более простая версия вашего метода:

public ArrayList<String> getCategory(String[] name) {
    String TABLE_BIRDS = "main";
    ArrayList<String> categories = new ArrayList<>();

    if (name[0] != null) {
        Log.d(LOG_TAG, name[0]);
    } else {
        Log.d(LOG_TAG, "name[0] has not been passed");
    }

    Cursor x = db.query(true, TABLE_BIRDS, new String[]{name[0]}, null, null, null, null, null, null);

    while (x.moveToNext()) {
        String category = x.getString(0);
        categories.add(category);
        Log.i("cursor loop", category);
    }

    if (x.getCount() == 0) {
        Log.i(LOG_TAG, "The cursor is not returning any data");
    }
    x.close();

    return categories;
}

Я думаю, name[0] содержит строку 'category', которая является столбцом, который вы хотите запросить.Поскольку вы передаете true в качестве 1-го аргумента в методе query(), это означает, что вы получите различные значения, поэтому нет необходимости в аргументе group by.Вам не нужна переменная COLUMN, так как у вас есть то, что вам нужно в переменной name.Также вам не нужно getColumnIndex(), поскольку курсор возвращает только 1 столбец.редактироватьВместо:

Cursor x = db.query(true, TABLE_BIRDS, new String[]{name[0]}, null, null, null, null, null, null);

попробуйте rawQuery ():

Cursor x = db.rawQuery("SELECT DISTINCT " + name[0] + " FROM " + TABLE_BIRDS, null);
...