- Он автоматически планирует весь доступ к БД на стороне сервера и синхронизации в фоновом потоке. Однако в интерфейсе приложения Content Resolver / Provider обычно выполняет запросы / транзакции из потока пользовательского интерфейса по умолчанию. Вы должны выполнять все транзакции асинхронно (то есть, используя
CursorLoader
), чтобы обеспечить бесперебойную работу вашего приложения на стороне пользовательского интерфейса
- Он локализует повторный вход в БД из любых потоков, которые получают доступ через
ContentProvider
, так что вся блокировка может происходить целиком в вызовах переопределения ContentProvider, а не отслеживание этого на уровне БД, службы и Слой пользовательского интерфейса.
- Как часть вышесказанного, он также предоставляет хороший одноэлементный интерфейс для ваших данных. Если в вашем приложении имеется десять классов Activity, вы просто выполняете статические вызовы ContentResolver для каждого из них, в отличие от необходимости открывать / закрывать SQLiteDatabase в каждом действии при переходе от одного действия к другому в вашем приложении.
- ContentProvider очень тесно связан с моделью SyncAdapter. Это означает, что это практически единственный путь, если вы хотите синхронизировать свою базу данных с базой данных, размещенной на сервере, в сети. (ваше приложение отражает ситуацию типа REST API)
- Он связан с интерфейсом ContentObserver ContentResolver. Это интерфейс, в котором (среди многих других полезных вещей) представление может регистрироваться как наблюдение определенного набора данных (через Курсор для этих данных). Затем, если вы внесете изменение в ContentProvider, CP может уведомить CR, который, в свою очередь, может уведомить любые соответствующие курсоры, которые, в свою очередь, запросят и приведут к обновлению представления. Это гораздо чище, чем необходимость вручную отслеживать ваши представления, чтобы вы могли сделать их недействительными и перерисовать.
Что касается повторной входящей блокировки БД, она не делает это полностью, но помогает - ваш класс ContentProvider реализует четыре простые функции (интерфейс CRUD) и, если вы решите переопределить его, пятую, batchAdd. () - Это локализует вашу блокировку. Простой ответ - просто пометить все четыре / пять из этих объявлений функций «синхронизированными» на уровне функций, и все готово. Гораздо чище, чем пытаться выяснить, как заблокировать 20 мест, которые обращаются к вашей БД в 5 разных Activites.