2009-11-13 10 views
0

값을 데이터베이스에 저장하고 저장된 데이터를 검색하는 응용 프로그램을 만들었습니다. 실행 모드에서 응용 프로그램을 실행하는 동안 모든 것이 잘 작동하는 것처럼 보이지만 값은 성공적으로 저장되고 검색됩니다. 그러나 디버그 모드로 실행하면 프로세스가 IllegalStateException을 던지고 지금까지 원인을 찾지 못했습니다. 모든 것이 잘 작동하지만 위의 코드를 실행하는 동안데이터베이스 문제 : 문제를 진단하고 해결하는 방법?

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

:

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; 
} 

과는 다른 클래스에서 호출 (설정) :

개체 기록을 검색하는 방법은 다음과 같다 다른 스레드에서 예외를 발견했습니다. alt text http://img509.imageshack.us/img509/862/illegalstateexception.jpg

그리고 무엇이 possib인지 모릅니다. 이 예외의 원인이 아니며 원인을 진단하기 위해 해당 스레드에서 코드를 디버깅하는 방법을 설명합니다.

여기에 가능한 문제가 누구인지 알고 있다면 매우 감사 할 것입니다.

감사합니다.

+1

예외의 전체 스택 추적은 무엇입니까? 적어도 관련된 비트는? – MattC

답변

2

cursor.close()이 "if"내부에있는 것처럼 보입니다. 즉, SQLiteCursor.finalize()이 IllegalStateException을 throw합니다. 예를 들어, 다른 프로세스/쓰레드가 커밋 할 시간이 없다면, 빈 레코드 셋을 얻게 될 것이다.

결과 집합이 비어 있어도 항상 닫습니다.

향후 호환성을 위해 색인이 아닌 이름으로 필드에 액세스하는 것이 좋습니다. 그리고 close()을 모두 finally{} 블록에 넣으십시오.

관련 문제