В чем ошибка этого курсора, созданного для базы данных?

Я создаю базу данных SQLite в android. Но всякий раз, когда я вызываю метод displayDatabase (), появляется некоторая ошибка.

Пожалуйста, помогите !!

Вот метод displayDatabase ():

public void displayDatabase() {

    DataDbHelper mDbHelper = new DataDbHelper(this);

    SQLiteDatabase db = mDbHelper.getReadableDatabase();

    String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
            DataContract.DataEntry.COLUMN_HEAD,
            DataContract.DataEntry.COLUMN_CITY,
            DataContract.DataEntry.COLUMN_COST};
    Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
            projection,
            null,
            null,
            null,
            null,
            null);
    TextView textView = (TextView) findViewById(R.id.textview);

    try {
        //textView.setText("The database contains - " + c.getColumnCount() + "Columns containing data");

        textView.setText("Hello Welcome\n");

        textView.append("-" + DataContract.DataEntry._ID
                + "---" + DataContract.DataEntry.COLUMN_PROJECT_NAME
                + "---" + DataContract.DataEntry.COLUMN_HEAD
                + "---" + DataContract.DataEntry.COLUMN_CITY
                + "---" + DataContract.DataEntry.COLUMN_COST + "\n");


        int currentId = c.getColumnIndex(DataContract.DataEntry._ID);
        int projectNameId = c.getColumnIndex(DataContract.DataEntry.COLUMN_PROJECT_NAME);
        int headId = c.getColumnIndex(DataContract.DataEntry.COLUMN_HEAD);
        int cityId = c.getColumnIndex(DataContract.DataEntry.COLUMN_CITY);
        int costId = c.getColumnIndex(DataContract.DataEntry.COLUMN_COST);


        while (c.moveToNext()) {
            int id = c.getInt(currentId);
            String projectName = c.getString(projectNameId);
            String head = c.getString(headId);
            String city = c.getString(cityId);
            String cost = c.getString(costId);

            textView.append("-" + id
                    + "---" + projectName
                    + "---" + head
                    + "---" + city
                    + "---" + cost);


        }


    } finally {
        c.close();
    }
}

И вот ошибка, появляющаяся в logcat:

CursorWindow: не удалось прочитать строку 0, столбец -1 из CursorWindow, который имеет 11 строк, 4 столбца. 03-15 10: 00: 58.359 6348-6348 /? E / AndroidRuntime: FATAL EXCEPTION: основной процесс: com.example.student.sampledatabase, PID: 6348 java.lang.IllegalStateException: не удалось прочитать строку 0, столбец -1 из CursorWindow. Убедитесь, что Курсор правильно инициализирован, прежде чем обращаться к нему с данными.


person Akshat Chaturvedi    schedule 15.03.2019    source источник
comment
вы пытаетесь получить индекс столбца, который вы не включили в оператор Select   -  person Vladyslav Matviienko    schedule 15.03.2019
comment
Кроме того, как действительно лучшую альтернативу прямому использованию SQLite, попробуйте вместо этого Room Persistence Library от Google (представленный в 2017 году). Прочтите здесь: developer.android.com/topic/libraries/architecture/room и посмотрите это, чтобы получить быстрое представление: youtube.com/watch?v=SKWh4ckvFPM Комната уменьшает весь шаблонный код SQLite и любую возможность ошибок, создавая его автоматически для вас. Вы можете напрямую сопоставить свои классы объектов данных с базой данных.   -  person MD Naseem Ashraf    schedule 15.03.2019


Ответы (2)


Добавьте этот столбец DataContract.DataEntry._ID в свой прогноз.

person PPartisan    schedule 15.03.2019

Причина ошибки

Причина сбоя в том, что делается попытка получить столбец со смещением -1, который никогда не будет существовать, поскольку смещения могут быть от 0 до количества столбцов в курсоре меньше 1.

Причина, по которой используется -1, заключается в том, что это значение, возвращаемое методом Cursor getColumnIndex, когда имя столбца, переданное методу, не существует в курсоре.

Причина, по которой вы получаете -1, заключается в том, что вы не включили столбец, имя которого соответствует DataContract.DataEntry._ID, разрешенному в курсоре, поэтому строка: -

int currentId = c.getColumnIndex(DataContract.DataEntry._ID);

приводит к тому, что currentId равен -1

Таким образом, указанная выше ошибка, когда выполняется следующая строка: -

int id = c.getInt(currentId);

Исправление

Одно из исправлений - указать null вместо проекции, это приведет к извлечению всех столбцов таблицы и эквивалентно использованию SELECT * FROM .......

например используя :-

Cursor c = db.query(DataContract.DataEntry.TABLE_NAME,
        null,
        null,
        null,
        null,
        null,
        null);

Еще одно исправление - изменить: -

String[] projection = {DataContract.DataEntry.COLUMN_PROJECT_NAME,
        DataContract.DataEntry.COLUMN_HEAD,
        DataContract.DataEntry.COLUMN_CITY,
        DataContract.DataEntry.COLUMN_COST};

вместо этого быть: -

String[] projection = {DataContract.DataEntry._ID,
        DataContract.DataEntry.COLUMN_PROJECT_NAME,
        DataContract.DataEntry.COLUMN_HEAD,
        DataContract.DataEntry.COLUMN_CITY,
        DataContract.DataEntry.COLUMN_COST};

Таким образом, столбец будет включен в Курсор, а смещение будет смещением этого столбца (0 в приведенном выше случае, поскольку это первый столбец в результате).

person MikeT    schedule 15.03.2019