Подтвердить что ты не робот

Android sqlite concurrency без исключений

Sqlite на android позволяет вам обращаться к базе данных из нескольких procs для чтения, но если вы в настоящее время пишете из одного процесса, чтение и запись из других procs вызовет исключение, потому что первая запись имеет блокировку на db.

Под "procs" я имею в виду другие потоки в одном приложении.

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

Предвосхищая "почему ты так делаешь?" ответы, это именно то, как мы это делаем, и что это так. Мы также не будем использовать контент-провайдера. Просто попробуйте синхронизировать доступ к db.

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

4b9b3361

Ответ 1

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

Итак, если вы обращаетесь к объекту через одноэлементный номер, проблем не должно быть. Хотя вы можете добавить некоторую дополнительную логику, если хотите реализовать тайм-аут, например. ждать/уведомлять или что-то подобное.

Ответ 2

Или вы можете использовать другую базу данных, которая ее поддерживает, например H2. Я знаю, это может показаться странной идеей. Но, согласно моему первоначальному тесту, он работает хорошо (как на эмуляторе, так и на устройстве) и на самом деле не медленнее. За исключением открытия и закрытия базы данных, которая в настоящее время довольно медленная, около 1 секунды, но это имеет другие причины и, надеюсь, будет исправлено в следующей версии.