2012-02-29 2 views
1

나는 웹에서 sqlite 데이터베이스로 데이터를 다운로드하고 저장하는 프로젝트에서 일하고있다. 몇 분 전에 나는 sqlite 데이터베이스가 이미 닫혔다 고 말하는 사용자로부터 우리 서버에 이상한 예외를받습니다. 예외가 발생한 곳의 전체 파일을 확인했는데 dbHelper.close();을 호출하지 않았습니다.안드로이드 데이터베이스 폐쇄 예외

public void insertCollectionCountries(JSONObject obj, Context context) { 
    //Insert in collection_countries 
    if(RPCCommunicator.isServiceRunning){ 
    Log.w("","JsonCollection - insertCollectionCountries"); 
    ContentValues valuesCountries = new ContentValues(); 

     try { 
      collectionId = Integer.parseInt(obj.getString("collection_id")); 
      dbHelper.deleteSQL("collection_countries", "collection_id=?", new String[] {Integer.toString(collectionId)}); 

      JSONArray arrayCountries = obj.getJSONArray("country_availability"); 
      for (int i=0; i<arrayCountries.length(); i++) { 
        valuesCountries.put("collection_id", collectionId); 
        String countryCode = arrayCountries.getString(i); 
        valuesCountries.put("country_code", countryCode); 
        dbHelper.executeQuery("collection_countries", valuesCountries); 
      } 
     } catch (JSONException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

및 오류 그 줄에 : 내 dbHelperClass에서

java.lang.IllegalStateException: database /data/data/com.stampii.stampii/databases/stampii_sys_tpl.sqlite (conn# 0) already closed 
    at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2123) 
    at android.database.sqlite.SQLiteDatabase.setTransactionSuccessful(SQLiteDatabase.java:734) 
    at com.stampii.stampii.comm.rpc.SystemDatabaseHelper.execQuery(SystemDatabaseHelper.java:298) 
    at com.stampii.stampii.comm.rpc.SystemDatabaseHelper.executeQuery(SystemDatabaseHelper.java:291) 
    at com.stampii.stampii.jsonAPI.JsonCollection.insertCollectionCounries(JsonCollection.java:548) 
    at com.stampii.stampii.jsonAPI.JsonCollection.executeInsert(JsonCollection.java:181) 
    at com.stampii.stampii.collections.MyService.downloadCollections(MyService.java:122) 
    at com.stampii.stampii.collections.MyService$2.run(MyService.java:74) 
    at java.lang.Thread.run(Thread.java:1020) 

과 기능 : 여기 dbHelper.executeQuery("collection_countries", valuesCountries);

로그 캣 메시지 여기에 응용 프로그램 충돌 및 로그 캣 메시지 기능입니다 데이터를 삽입하는 데 사용하고 있습니다.

public boolean executeQuery(String tableName,ContentValues values){ 
    return execQuery(tableName,values); 
} 

private boolean execQuery(String tableName,ContentValues values){ 
    sqliteDb = instance.getWritableDatabase(); 
    sqliteDb.beginTransaction(); 
    sqliteDb.insert(tableName, null, values); 
    sqliteDb.setTransactionSuccessful(); 
    sqliteDb.endTransaction(); 
    return true; 
} 

다른 안드로이드 버전, 다른 장치 (HTC EVO 3D, 삼성 갤럭시 넥서스, HTC 욕망, LG 옵티 머스 패드, 다른 장치와 함께 몇 가지 에뮬레이터 에서이 코드를 테스트했기 때문에 내 sqlite 데이터베이스를 닫을 수있는 아이디어 또는 그 예외를 일으킬 수있는 모든 아이디어, 삼성 갤럭시 S2, 삼성 갤럭시 노트) 그리고 잘 작동합니다.

미리 감사드립니다.

+0

db를 닫으십시오. 어쩌면 onClose() .. onResume() 또는 유사한 ..에서 다시 열면 참조하십시오. – Tapirboy

답변

0

제가 생각할 수있는 가장 간단한 해결책은 execQuery()의 시작 부분에서 open()을 호출하고 값을 반환하기 전에 close()를 호출하는 것입니다.

도움이되는지 알려주세요.

-2

사용자가 최신 버전의 Chrome을 사용하는 경우 데이터베이스의 형식이 잘못되어 Chrome에서 자동 삭제할 수 있으며 일반적인 페이지 언로드 및 트랜잭션 중에 데이터베이스가 폐쇄되어 있기 때문에 예외가 발생할 수도 있습니다 폐쇄 된 데이터베이스에 대해 더 이상 자동으로 실패하지 않습니다.