База данных Android SQLite с многопоточностью

Я работаю над приложением, где мне нужно использовать многопоточность. У меня есть один экземпляр класса SQLiteOpenHelper в моем приложении, где у меня есть методы для открытия и закрытия и некоторые методы для вставки и выборки данных.

Теперь моя проблема в том, что я открываю базу данных в Первом потоке и запускаю транзакции в то же время, Второй поток также получает открытый объект базы данных и запускает транзакции.

Первый поток завершает свой процесс и закрывает базу данных на другой стороне, мой Второй поток работает, а Второй поток > получает, что база данных закрыта.

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

заранее спасибо


person Farrukh    schedule 12.10.2012    source источник
comment
Я здесь не эксперт, но вы думали о том, чтобы синхронизировать функции CRUD?   -  person rahul    schedule 12.10.2012
comment
используйте contentProvider, я думаю, что он поместит все ваши запросы в один и тот же поток   -  person njzk2    schedule 12.10.2012


Ответы (2)


У меня есть один экземпляр класса SQLiteOpenHelper во всем моем приложении, где у меня есть методы для открытия и закрытия базы данных и некоторые методы для вставки и извлечения данных.

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

Также не исключено, что вы просто никогда не закрываете базу данных. Если вы реализуете ContentProvider, вы никогда не закроете свою базу данных. Хотя это может вызвать предупреждения в LogCat об утечке открытых дескрипторов базы данных, транзакционная природа SQLite означает, что сбой закрытия базы данных не должен вызывать особых проблем (например, сбой очистки буфера).

person CommonsWare    schedule 12.10.2012
comment
Большое спасибо @CommonsWare. Я пытаюсь ответить на ваш вопрос, чтобы не закрывать базу данных. Думаю, сложно найти какой-то правильный способ сделать это. Мне нужна ваша дополнительная помощь для решения других проблем, надеюсь, вы мне поможете. - person Farrukh; 16.10.2012

Обычно я просто оставляю базу данных SQLLite Android открытой и закрываю ее в конце приложения, однако это не устраняет первоначальную проблему.

Я обнаружил, что когда БД не закрывается должным образом, у нее могут возникнуть проблемы с открытием на Android, поэтому простое никогда не закрывайте БД, похоже, не работает для меня.

Я оборачиваю все операции в транзакции и блоки обработчиков исключений.

Обратите внимание, что все транзакции должны быть завершены к моменту закрытия БД, поэтому метод закрытия ожидает завершения транзакций (для этого у меня также есть счетчик транзакций).

Вот пример блока транзакции try catch, в который я заключаю все операции с БД:

SQLPersistentStore расширяет SQLiteOpenHelper getPersistentStore() {возвращает null при закрытии БД}..

аннулировать публичную операцию (..) {

   SQLPersistentStore persistentStore = null;

    try {
            persistentStore = getPersistentStore();
            persistentStore.beginTransaction();

        ... do the DB operations

        persistentStore.setTransactionSuccessful();

    } catch ( IllegalStateException e) {
        ... 
        Log.w(...
    } catch (Exception e) {
        Log.e(TAG, ...
            throw new RuntimeException(e);
    } finally {
        if(persistentStore != null){
            persistentStore.endTransaction();
        }
    }

Когда БД закрывается и вы пытаетесь выполнить над ней операцию, вы получаете исключение IllegalStateException, и оно перехватывается.

person user2598153    schedule 08.01.2014