База данных Android закрытое исключение - PullRequest
1 голос
/ 29 февраля 2012

Я работаю над проектом, где я загружаю и сохраняю данные из сети в базу данных 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, Samsung Galaxy Nexus, HTC Desire, LG OPTIMUS PAD, Samsung Galaxy S2, Samsung Galaxy Note) и работает нормально.

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2012

Если пользователь использует последнюю версию Chrome, возможно, база данных была искажена, и Chrome удалил ее для вас, и также возможно, что исключение состоит в том, что база данных была закрыта во время обычной выгрузки страницы и транзакций с закрытая база данных больше не завершается с ошибкой.

0 голосов
/ 24 апреля 2012

Самое простое решение, о котором я могу подумать, это вызвать open () в начале execQuery () и вызвать close () непосредственно перед возвратом значения.

Дайте мне знать, поможет ли это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...