Получить все столбцы строк из курсора SQLite в объект

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

private ArrayList<String> column1,column2,column3,column4, ... column n;
public getCursorData(Cursor cursor){
    if (cursor.moveToFirst()){
        do{
            column1.add(Cursor.getString("column1"));
            column2.add(Cursor.getString("column2"));
            column3.add(Cursor.getString("column3"));
            column4.add(Cursor.getString("column4"));
            ...
            columnn.add(Cursor.getString("columnN"));
        }while(cursor.moveToNext());
    }
}

Я ищу способ хранить их в одном объекте (или массиве, или списке, или что-то еще), но я не могу понять, как это сделать

private Object[] object;
public getCursorData(Cursor cursor){
    if (cursor.moveToFirst()){
        int i=0;
        do{
            for(int f=0;f<cursor.getColumnCount();f++){
                object[i].put(cursor.getColumnName(i), cursor.getString(i)); // I don't know what I am doing!
            }
            i++;
        }while(cursor.moveToNext());
    }
}

Другая попытка использования массивов, где каждый столбец представляет собой целое число.

private String[][] data;
public getCursorData(Cursor cursor){
    if (cursor.moveToFirst()){
        int i=0;
        do{
            for(int f=0;f<cursor.getColumnCount();f++){
                data[i][f]=cursor.getString(f); // this is line 30
            }
            i++;
        }while(cursor.moveToNext());
    }
}

Эта последняя попытка не удалась, выдав следующую ошибку java.lang.NullPointerException: Attempt to read from null array в строке 30 (я отметил эту строку в комментарии к коду)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
815
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, вы можете создать пользовательский объект для сопоставления этих значений. Что-то вроде:

public class TableData {
    public String mColumn1;
    public String mColumn2;
    public String mColumn3;
    public String mColumn4;
    public String mColumn5;
}

public ArrayList<TableData> getCursorData(Cursor cursor) {

    ArrayList<TableData> resultList = new ArrayList();

    if (cursor.moveToFirst()){
        do{
            TableData row = new TableData();
            row.mColumn1 = Cursor.getString("column1");
            row.mColumn2 = Cursor.getString("column2");
            row.mColumn3 = Cursor.getString("column3");
            ...
            resultList.add(row);
        } while(cursor.moveToNext());
    }

    return resultList;
}

Редактировать:

Если вы хотите сохранить свой подход, вам следует:

private String[][] data;

public void getCursorData(Cursor cursor) {
    if (cursor.moveToFirst()) {
        data = new String[cursor.getCount()][]; // You have to instantiate your bi-dimensional array
        int i = 0;
        do {
            data[i] = new String[cursor.getColumnCount()];
            for (int f = 0; f < cursor.getColumnCount(); f++) {
                data[i][f] = cursor.getString(f);
            }
            i++;
        } while (cursor.moveToNext());
    }
}

Мне нравится эта идея, но есть ли способ избежать повторения row.mColumnN = Cursor.getString("columnN");? делать для или карту или что-то? Я попробую второй способ и дам вам знать.

stramin 10.07.2019 23:08

Второй метод работает для меня, но мне также пришлось объявить длину второго измерения (data=new String[cursor.getCount()][8];), спасибо за вашу помощь.

stramin 10.07.2019 23:21

Другие вопросы по теме