2012-02-29 100 views
1

我正在從事一個項目,我正在下載並將數據從web保存到sqlite數據庫。幾分鐘前,我收到一個奇怪的例外,我們的服務器從一個用戶說,sqlite數據庫已經關閉..我只檢查了整個文件發生異常,我不打電話dbHelper.close();。這裏是應用程序崩潰和logcat的消息功能:Android數據庫關閉異常

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

看看你在哪裏*關閉數據庫。也許在onClose()..也,看看你是否再次打開onResume()或類似.. – Tapirboy 2012-02-29 15:45:33

回答

0

我能想到的最簡單的解決方案是在execQuery()開始時調用open()並在返回值之前調用close()。

讓我知道它是否對你有幫助。

-2

如果用戶使用的是最新版本的Chrome,可能是數據庫格式不正確,並且Chrome會將其刪除,而且該異常也有可能是因爲在正常的頁面卸載和事務處理期間數據庫已關閉針對已關閉的數據庫不再默默失敗。