Что за ошибка в этом курсоре создана для базы данных? - PullRequest
0 голосов
/ 15 марта 2019

Я создаю базу данных 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: main Процесс: com.example.student.sampledatabase, PID: 6348 java.lang.IllegalStateException: Не удалось прочитать строку 0, столбец -1 из CursorWindow.Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него.

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

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

0 голосов
/ 15 марта 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 вместо projection , это приведет к извлечению всех столбцов таблицы и будет эквивалентно использованию 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 в случае выше, поскольку это первый столбец в результате).

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