IllegalStateException на курсоре - PullRequest
2 голосов
/ 05 марта 2019

Я получаю эту ошибку при попытке чтения из БД SQLite

IllegalStateException: Не удалось прочитать строку 0, столбец -1 из CursorWindow. Убедитесь, что курсор инициализирован правильно, прежде чем получить доступ к данным из него.

DbHelper dbHelper = new DbHelper(this);
SQLiteDatabase database = dbHelper.getWritableDatabase();
Cursor cursor = dbHelper.readNumber(database);

String ItemId;

if (cursor.getCount() > 0) {
    while (cursor.moveToNext()) {
        //getting the ERROR here
        ItemId = cursor.getString(cursor.getColumnIndex(DbContract.ITEMID));
        number = cursor.getString(cursor.getColumnIndex(DbContract.PHONE_NUMBER));
        callType = cursor.getString(cursor.getColumnIndex(DbContract.CALL_TYPE));
        callDate = cursor.getString(cursor.getColumnIndex(DbContract.CALL_DATE));
        callDuration = cursor.getString(cursor.getColumnIndex(DbContract.CALL_DURATION));

        arrayList.add(new PhNumber(ItemId, number, callType, callDate, callDuration));
        if (debug) {
            Log.i(TAG, "DATA FOUND IN DB:\n" + "\t ID: " + ItemId + ", Number: " + number + "\n");
        }
    }
    cursor.close();
    dbHelper.close();
    result = true;
    if (debug) {
        Log.d(TAG, " Number of items in DB: " + arrayList.size());
    }
} 

readNumber

public Cursor readNumber(SQLiteDatabase database) {
    String[] projections = {"id", DbContract.PHONE_NUMBER};
    return (database.query(DbContract.TABLE_NAME, projections, null, null, null, null, null));
}

Это моя БД

private static final String CREATE = "create table " + DbContract.TABLE_NAME +
        "(id integer primary key autoincrement,"
        + DbContract.ITEMID + " text, "
        + DbContract.PHONE_NUMBER + " text, "
        + DbContract.CALL_TYPE + " text, "
        + DbContract.CALL_DATE + " text, "
        + DbContract.CALL_DURATION + " text, "
        + DbContract.SYNC_STATUS + " text)";

Ответы [ 2 ]

1 голос
/ 05 марта 2019

В вашей проекции, созданной вызовом readNumber, возвращаются только столбцы id и PHONE_NUMBER.Вероятно, DbContract.ITEMID не равно id и при попытке поиска DbContract.ITEMID в курсоре он не найден.Чтобы это исправить, вам нужно использовать метод ITEMID в readNumber, например:

public Cursor readNumber(SQLiteDatabase database) {
    String[] projections = {DbContract.ITEMID, DbContract.PHONE_NUMBER};
    return (database.query(DbContract.TABLE_NAME, projections, null, null, null, null, null));
}

Другая проблема заключается в том, что вы пытаетесь получить доступ и к другим полям, например: CALL_TYPE, CALL_DATEи т. д.

Итак, чтобы устранить проблему, вы также:

  • Не пытайтесь получить поля, которые не являются частью результата.
  • Добавьте также необходимые поля в проекцию.
0 голосов
/ 05 марта 2019

Обнаружена проблема: Я пытался получить доступ к столбцам, которые не были добавлены в проекты в методе readNumber, и добавление этих прогнозов решило проблему.

readNumber

    public Cursor readNumber(SQLiteDatabase database) {
    String[] projections = {
            DbContract.ITEMID,
            DbContract.PHONE_NUMBER,
            DbContract.CALL_TYPE,
            DbContract.CALL_DATE,
            DbContract.CALL_DURATION};
    return (database.query(DbContract.TABLE_NAME, projections, null, null, null, null, null));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...