2012-02-29 9 views
1

私は、Webからsqliteデータベースにデータをダウンロードして保存するプロジェクトに取り組んでいます。数分前に、私のサーバーに、sqliteデータベースがすでに閉じられているというユーザーからの奇妙な例外が表示されました。例外が発生したファイル全体を確認しましたが、私はdbHelper.close();を呼び出していません。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(); 
     } 
    } 
} 

とエラーがその行にある:ここでアプリがクラッシュし、LogCatメッセージ機能があり、ここでdbHelper.executeQuery("collection_countries", valuesCountries);

はLogCatメッセージです:

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) 

と機能データを挿入するために使用しています:

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、Samsung Galaxy Nexus、HTC Desire、LG OPTIMUS PAD、サムスンギャラクシーS2、サムスンギャラクシーノート)、それは正常に動作しています。

ありがとうございます!

+0

ここで、dbを閉じる*を見てください。たぶんonClose()で.. onResume()などで再び開いたかどうかを確認してください。 – Tapirboy

答えて

0

私が考えることができる最も簡単な解決策は、execQuery()の開始時にopen()を呼び出し、値を返す直前にclose()を呼び出すことです。

私があなたを助けるかどうか教えてください。

-2

最新のバージョンのChromeを使用している場合、データベースが不正な形式でChromeによって削除されている可能性があります。また、通常のページのアンロードとトランザクション中にデータベースが閉じられている可能性もあります閉じられたデータベースに対しても、自動的に失敗しません。

関連する問題