2012-03-02 2 views
0

서버에서 데이터를 얻을 때, 나는 내 자신의 콘텐츠 공급자에 데이터를 삽입하지만 항상 오류가 발생했습니다.()는 SQLiteDatabase.isOpen을 확인합니다,안드로이드 삽입 데이터 SQLite 오류 java.lang.IllegalStateException에 의해 발생 : 데이터베이스가 열려

SQLiteDatabase db = dbHelper.getWritableDatabase(); 
try{ 
    long id = db.insertWithOnConflict(TABLE, null, values,SQLiteDatabase.CONFLICT_REPLACE); 
    if(id == -1){ 
     throw new RuntimeException(String.format("%s : Failed to insert [%s] to [%s] for unknow reason,", TAG, values, uri)); 
    }else{ 
     return ContentUris.withAppendedId(uri, id); 
    } 
}finally{ 
    db.close(); 
} 

그리고 난 안드로이드 소스 코드에서 오류 메시지를 찾을 :이 로그

Caused by: java.lang.IllegalStateException: database not open 
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1585) 
at com.weiboa.data.StatusProvider.insert(StatusProvider.java:107 
    at android.content.ContentProvider$Transport.insert(ContentProvider.java:210) 
    at android.content.ContentResolver.insert(ContentResolver.java:606) 
    at com.weiboa.util.WeiboUserUtil.insertTweet(WeiboUserUtil.java:121) 

이며,이 내 ContentProvider 내 삽입 코드 getWritableDatabase 함수에서 항상 데이터베이스가 열려 있는지 확인합니다.

if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { 
     return mDatabase; // The database is already open for business 
    } 

그래서이 오류의 원인을 알 수없는 이유는 데이터베이스가 열리지 않은 이유입니다.

+1

'finally { db.close(); }' – Luksprog

+0

고맙습니다. 그것은 성공적으로 작동, 하지만 난 항상 wirte 후 폐쇄 다른 프로젝트에서 작동합니다. 콘텐츠 공급자의 데이터베이스를 닫을 수없는 이유는 무엇입니까? – regrecall

+0

이유를 모르겠습니다. 얼마 전 데이터베이스 예외를 해결하기 위해 노력하고 있었고 오류 유형을 확인하고 위에서 말한 답변 중 하나를 기억했습니다. 나는'try-finally'와 간단한'insert'를 사용하여'ContentProvider' 중 하나에서 약간의 테스트를했고 완벽하게 작동합니다. – Luksprog

답변

0

나는 정확히 같은 문제가있었습니다. @Luksprog 첫 코멘트에서 언급 한 바와 같이

당신은 명시 적으로 데이터베이스를 닫을 필요, 콘텐츠 제공 업체에서 일반적으로

db.close(); 

을 결코 제거되지 않습니다. 도우미가 당신을 위해 그것을합니다.

관련 문제