проблема блокировки базы данных в HTC Desire - PullRequest
3 голосов
/ 05 августа 2011

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

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

В samsung gt15801 все работает нормально.Но htc desire это приведет к ошибке блокировки базы данных.

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

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

1 Ответ

14 голосов
/ 05 августа 2011

Попробуйте использовать один 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);

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

...