Как проверить состояние блокировки и разблокировать при необходимости для базы данных на Blackberry? - PullRequest
4 голосов
/ 29 марта 2012

С тех пор, как я начал разрабатывать свое приложение Blackberry, самые большие проблемы, с которыми я сталкивался, были связаны с базами данных SQLite.

Сейчас я проверяю свое приложение на стресс-тестах и, когда возникают проблемы.всплываю я обращаюсь к ним, распечатывая статусы на консоли и заботясь о вещах построчно.Прямо сейчас (после нажатия кнопок в моем приложении) я получил ошибку «База данных заблокирована», и я не уверен, что делать.

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

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

Спасибо

РЕДАКТИРОВАТЬ: это то, что происходит в моем приложении ..... Когда я запускаю, он запускает поток, этот поток выполняеточистка одной из моих таблиц, основанная на том, сколько лет определенным частям данных (использует DELETE).Затем поток продолжает получать объект USER из моей БД (только для чтения), затем он использует этот объект USER в качестве параметра для вызова веб-службы.Данные, извлеченные из веб-службы, вставлены в мою базу данных.(Это немного сложнее, чем когда выполняются несколько операций чтения / записи. После этого поток запускает метод обратного вызова для обновления моего пользовательского интерфейса.

Все это работаетЯ могу выйти из приложения, пока поток запущен и перезапущен, и флаг помешает ему запустить новый экземпляр того же потока (если, конечно, другой не будет выполнен).

Теперь моя проблема: домашний экран моего приложения представляет собой список кнопок, когда пользователь нажимает одну из этих кнопок на другую, загружается более подробный список (для этого требуется вызов ТОЛЬКО ЧТЕНИЕ в базу данных) .При запуске приложения (запусквызывающий поток веб-службы), а затем сразу же нажимает кнопку на главном экране, таблица блокируется (не всегда, иногда это занимает 4 или 5 попыток, иногда больше, иногда меньше). Но если я продолжу это делать, БУДЕТв конечном итоге блокировка делает невозможным выполнение каких-либо вызовов для моей БД, следовательно, больше нет пользовательского интерфейса (который зависит от БД).

вызов БД, которыйна втором экране отображается надпись ТОЛЬКО ДЛЯ ЧТЕНИЯ, разве я не могу иметь столько их, сколько мне нужно ??Что вызывает блокировку БД ??В чем разница между блокировкой БД и ошибкой файловой системы (12) ??

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

Кажется, я решил проблему. У меня сложилось впечатление, что если соединение для чтения / записи открыто, то соединение только для чтения может быть безопасно создано.

Кажется, это не так. Если у меня открыто соединение для чтения / записи, никакие другие соединения не могут открыться, пока оно не будет завершено.

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

Пока все хорошо.

3 голосов
/ 31 марта 2012

Sqlite не поддерживает одновременную модификацию.На практике на BlackBerry это означает, что вы можете открывать базу данных только из одной части кода за раз.Чтобы поддерживать этот доступ за один раз, вам нужно закрыть базу данных, когда вы закончите с ней, как указывает @AnkitRox.

Однако вам также нужно остерегаться одновременного доступа.Даже если ваш код правильно закрывает базу данных, два разных потока могут получить доступ к базе данных.В этом случае вам понадобится один, чтобы подождать.В Java-ME это обычно выполняется с помощью ключевого слова synchronized и с использованием одного и того же объекта блокировки для доступа ко всем базам данных.

1 голос
/ 30 марта 2012

Проверьте, правильно ли вы открываете и закрываете базу данных до и после выполнения запроса соответственно.

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

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