我正在开展一个项目,我正在下载并将数据从Web保存到sqlite数据库。几分钟前,我从一个用户那里收到一个奇怪的异常,就是说sqlite数据库已经关闭了......我只是检查了发生异常的整个文件,我没有调用dbHelper.close();
。这是应用程序崩溃的函数和LogCat消息:
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();
}
}
}
,错误就在该行:dbHelper.executeQuery("collection_countries", valuesCountries);
这是LogCat消息:
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)
并在我用于插入数据的dbHelperClass
中运行:
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;
}
任何可以关闭我的sqlite数据库的想法或可能导致该异常的想法,因为我已经在一些具有不同Android版本,不同设备(HTC EVO 3D,三星Galaxy Nexus,HTC Desire,LG OPTIMUS)的模拟器上测试了此代码PAD,三星Galaxy S2,三星Galaxy Note)它的工作正常。
提前致谢!
答案 0 :(得分:0)
我能想到的最简单的解决方案是在execQuery()的开头调用open()并在返回值之前调用close()。
让我知道它是否对你有所帮助。
答案 1 :(得分:-2)
如果用户使用的是最新版本的Chrome,则可能是数据库格式错误且Chrome已将其删除,而且异常也可能是因为数据库在正常页面卸载和交易期间关闭了一个封闭的数据库不再无声地失败。