Проблема блокировки базы данных в 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);
Вышеуказанные удаленные методы устарели, поэтому не используйте их.