【问题标题】:Android database closed exceptionAndroid数据库关闭异常
【发布时间】:2012-02-29 13:01:38
【问题描述】:

我正在从事一个项目,我正在将数据从网络下载并保存到 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),它工作正常。

提前致谢!

【问题讨论】:

  • 看看你在哪里关闭了数据库。也许在 onClose().. 还有,看看你是否在 onResume() 或类似的地方再次打开它..

标签: android database sqlite


【解决方案1】:

我能想到的最简单的解决方案是在 execQuery() 的开头调用 open() 并在返回值之前调用 close()。

如果对你有帮助,请告诉我。

【讨论】:

    【解决方案2】:

    如果用户使用的是最新版本的Chrome,有可能是数据库格式错误,Chrome为你删除了,也有可能是正常的页面卸载和事务处理过程中数据库被关闭了关闭的数据库不再静默失败。

    【讨论】:

      猜你喜欢
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-12-02
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2014-12-27
      • 2010-09-07
      相关资源
      最近更新 更多