EDIT:
Кажется, я ошибаюсь в своем утверждении ниже: реализация SQLite, по мнению многих, поточно-ориентирована. Я, однако, испытывал горькие проблемы с многопоточностью, особенно при тестировании доступа к базе данных, но тогда, я полагаю, это было вызвано другими факторами в моем коде.
Извините за вводящий в заблуждение ответ.
ПРОИСХОЖДЕНИЕ:
Хороший вопрос!
Здесь вы должны быть очень осторожны , поскольку стандартные объекты доступа к базе данных Android (такие как SQLiteDatabase
, Cursor
и т. Д.) По умолчанию не являются поточно-ориентированными. Даже ContentProvider
, кажется, не дает вам полной защиты, если вы явно не напишите их с учетом многопоточности.
Согласно документации Android по ContentProvider
и многопоточности (почти в конце страницы):
"Поскольку эти методы [update()
- одна из функций] могут вызываться из любого числа потоков одновременно, они также должны быть реализованы для обеспечения безопасности потоков."
Я не знаю, существует ли какой-либо явный механизм блокировки для баз данных SQLite (как при блокировке реального файла базы данных). Я бы предположил, что сама транзакция заблокируется, по крайней мере, с той самой ручкой, с которой вы обращаетесь к своей базе данных. Я не знаю, что верно для случая, когда у вас есть несколько дескрипторов вашей базы данных.
Возможно, вы могли бы попытаться реализовать какой-то одноэлементный объект (A ContentProvider
, может быть?) Для доступа к вашей базе данных, но даже тогда вам, вероятно, придется управлять некой «очередью запросов».
Вам также следует учитывать , а не для любых вызовов файловой системы (база данных находится в файловой системе) из потока пользовательского интерфейса, что бы то ни было. Нет гарантии, что база данных ответит вовремя, и вы, скорее всего, получите ANR (особенно когда вы пишете "...which generates quite an amount of data"
).