나는 웹에서 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, 삼성 갤럭시 노트) 그리고 잘 작동합니다.
미리 감사드립니다.
db를 닫으십시오. 어쩌면 onClose() .. onResume() 또는 유사한 ..에서 다시 열면 참조하십시오. – Tapirboy