В чем разница между contentprovider и contentResolver в android

в чем разница между ContentProviders и ContentResolver? Я не хочу для

5 ответов


Я нашел некоторое объяснение здесь. В резюме

Сельсин Контент разрешает URI к определенному контент-провайдер.

Контент-Провайдер предоставляет интерфейс для запроса содержимого.

способ запроса поставщика контента -contentResolverInstance.query(URI,.....)


ContentProviders используются абстрагировать базу данных от других частей и действует как интерфейс между вашей базой данных и UI / другими классами. Вы должны создать свой собственный ContentProvider чтобы поделиться своими данными приложения с другими приложениями.

ContentResolver используется для выбора правильного ContentProvider на основе ContentUris. А ContentUri может выглядеть как

содержание: / / com.андроид.контакты/контакты/3

  • содержание:// называется схемы и указывает, что это ContentUri.
  • com.андроид.контакты называется Content authority и ContentResolver использует его для разрешения уникального поставщика (в этом случае ContactProvider).
  • контакты - это путь что определить какой-то набор данные поставщика (например, имя таблицы).
  • 3 - это id используется для уникальной идентификации строки в набор данных.

enter image description here

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

посмотреть контент-провайдеры в Android для более подробной информации


вы можете легко понять, таким образом,

Контент-Провайдеров используются для expose data .

С другой стороны

Сельсин Контент это corresponding class раньше query и проанализировать Transactions те Content Providers.

на Сельсин Контент включает в себя query & transaction methods соответствует тем, кто в вашем Контент-Провайдеров.


двухслойная абстракции :

ContentResolver --> ContentProvider -->SQLiteDatabase

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

ContentProvider предоставляет личные данные вашего приложения для внешнего приложения
в то время как
ContentResolver предоставляет правильный ContentProvider среди всех ContentProviders, использующих URI.

глубокий Понимание (двухслойной абстракции)

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

как делятся данными?

ContentProvider и ContentResolver являются частью . Эти два класса работают вместе, чтобы обеспечить надежную и безопасную модель обмена данными между приложениями.
ContentProvider предоставляет данные, хранящиеся в базе данных SQLite, другому приложению, не сообщая им о базовой реализации вашей базы данных.
Таким образом, он абстрагирует SQliteDatabase. но подождите, есть подвох !!!
Внешнее приложение не может напрямую получить доступ к ContentProvider. Для этого вам нужно сначала взаимодействовать с другим классом ContentResolver Подумайте ContentResolver как искатель ContentProvider. Есть только один экземпляр этого и все ContentProviders вашего устройства зарегистрированы с простым URI пространства имен. Если вы хотите достичь определенного ContentProvider вам просто нужно знать его URI. Передайте его ContentResolver, и он найдет поставщика с помощью URI.
Теперь давайте посмотрим на самый важный метод getContentResolver().query(URI,String[] proj.....)

что происходит, когда getContentResolver().query(URI,String[] proj.....) вызывается

query() метод принадлежит классу ContentResolver однако он вызывает абстрактный метод query () разрешенного ContentProvider и возвращает объект Курсора.
Таким образом, внешнее приложение получает доступ к частной базе данных через два уровня абстракции.

просто, чтобы добавить больше очков
Вы не можете создать свой собственный класс ContentResolver, но вы всегда можете создать свой собственный ContentProvider класс

надеюсь, что у вас есть лучшее понимание
Вы можете Также см. Пример кода здесь для создания SQLitedatabase, ContentProvider и т. д., Но это не хорошо документировано.


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

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

кассир в ABC Bank (Content Resolver) - > ABC Bank Gateway (Content Provider) - > банковский сервер (база данных).

выше кассир не знает ни о реализации банковского шлюза, ни о банковской базе данных

таким же образом content resolver будет запрашивать контент поставщик и ContentProvider предоставляет эти данные, хранящиеся в базе данных SQLite, другому приложению без уведомления о реализации вашей базы данных.