2009-11-13 3 views
0

Я создал приложение, которое хранит значения в базе данных и извлекает сохраненные данные. При запуске приложения в режиме запуска все работает нормально (значения сохраняются и извлекаются успешно), но когда я запускаю в режиме отладки, процесс вызывает исключение 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; 
} 

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

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

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

Спасибо!

+1

Какая полная стек исключений? Или, по крайней мере, соответствующие биты? – MattC

ответ

2

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

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

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

Смежные вопросы