Проблема с базой данных: как диагностировать и устранить проблему? - PullRequest
0 голосов
/ 13 ноября 2009

Я создал приложение, которое сохраняет значения в базе данных и извлекает сохраненные данные. При запуске приложения в режиме запуска все работает нормально (значения сохраняются и извлекаются успешно), но когда я запускаю в режиме отладки, процесс выдает исключение IllegalStateException и до сих пор не нашел причину.

Метод извлечения объекта Запись следующий:

public Recording getRecording(String filename) {

    Recording recording = null;
    String where = RECORDING_FILENAME + "='" + filename + "'";
    Log.v(TAG, "retrieving recording: filename = " + filename);

    try {
        cursor = db.query(DATABASE_TABLE_RECORDINGS, new String[]{RECORDING_FILENAME, RECORDING_TITLE, RECORDING_TAGS, RECORDING_PRIVACY_LEVEL, RECORDING_LOCATION, RECORDING_GEO_TAGS, RECORDING_GEO_TAGGING_ENABLED, RECORDING_TIME_SECONDS, RECORDING_SELECTED_COMMUNITY}, where, null, null, null, null);

        if (cursor.getCount() > 0) {
            cursor.moveToFirst();
            //String filename = c.getString(0);
            String title = cursor.getString(1);
            String tags = cursor.getString(2);
            int privacyLevel = cursor.getInt(3);
            String location = cursor.getString(4);
            String geoTags = cursor.getString(5);
            int iGeoTaggingEnabled = cursor.getInt(6);
            String recordingTime = cursor.getString(7);
            String communityID = cursor.getString(8);
            cursor.close();
            recording = new Recording(filename, title, tags, privacyLevel, location, geoTags, iGeoTaggingEnabled, recordingTime, communityID);
        }
    }
    catch (SQLException e) {
        String msg = e.getMessage();
        Log.w(TAG, msg);
        recording = null;
    }
    return recording;
}

и вызывается из другого класса (Настройки):

private Recording getRecording(String filename) {
    dbAdapter = dbAdapter.open();
    Recording recording = dbAdapter.getRecording(filename);
    dbAdapter.close();
    return recording;
}

При выполнении кода выше все работает нормально, но затем я замечаю исключение в другом потоке: альтернативный текст http://img509.imageshack.us/img509/862/illegalstateexception.jpg

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

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

Спасибо!

1 Ответ

2 голосов
/ 14 ноября 2009

Похоже, что cursor.close() находится внутри "if" - тогда SQLiteCursor.finalize() сгенерирует исключение IllegalStateException (я гуглил его). Например, вы можете получить пустой набор записей, если у какого-либо другого процесса / потока не было времени для фиксации.

Всегда закрывайте его, даже если его набор результатов пуст.

Я бы также посоветовал вам обращаться к полям по именам, а не по индексам, для будущей совместимости. И сделать оба close() с в finally{} блоках.

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