Проблема блокировки базы данных в HTC Desire

В моем приложении одна служба получает данные с сервера и вставляет их в table A,

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

Он работает нормально в Samsung GT15801. Но htc desire это сгенерирует ошибку блокировки базы данных.

HTC desire - процесс вставки занимает 91 секунду.

Samsung gt15801 - процесс вставки занимает 21 секунду.

1 ответ

Решение

Попробуйте использовать один SqliteDatabaseHelper и сделать его одним экземпляром. После этого не закрывайте экземпляр SqliteDatabase после завершения ваших операций.

Вы можете реализовать блокировку базы данных, чтобы увидеть это

http://www.sqlite.org/lockingv3.html

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

database.beginTransaction(); /* for start transaction */

и после завершения операции с базой данных вы можете использовать

database.setTransactionSuccessful();    
database.endTransaction();

Но если вы даете ошибку между транзакциями, то не устанавливайте database.setTransactionSuccessful(); так что транзакция будет откатом.

Также в момент ошибки вы можете проверить, находится ли база данных в транзакции или нет, database.inTransaction(); если он вернет true, то вы находитесь в транзакции, иначе вы не в транзакции

Также Вы можете проверить, заблокирована или нет текущая база данных, позвонив

database.isDbLockedByCurrentThread();
database.isDbLockedByOtherThreads();

это вернет логическое значение.

Также вы можете установить, хотите ли вы заблокировать вашу базу данных, если несколько потоков пытаются читать и записывать вашу базу данных одновременно

database.setLockingEnabled(boolean);

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

Другие вопросы по тегам