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

В чем разница между ContentProviders и ContentResolver? Я не хочу SQLite базу данных. Разрабатываю приложение для СМИ.


person Akshay Mukadam    schedule 18.09.2013    source источник
comment
то же самое, что и между предоставлением и разрешением ... короче: реализация ContentProvider предоставляет некоторые данные для некоторых полномочий ... ContentResolver решает, какой поставщик (на основе полномочий) следует использовать, и запрашивает данные у этого поставщика ...   -  person Selvin    schedule 18.09.2013
comment
@Selvin F Я хочу создать программу для плейлиста, чем я думаю, что мне нужно создать поставщика контента. Пожалуйста, расскажите мне, как создать наших собственных ContentProvider'ов   -  person Akshay Mukadam    schedule 18.09.2013
comment
queception.com/question.php?question=107   -  person Stack Overflow    schedule 06.08.2019
comment
Если у кого-то из вас есть основы работы с сетями, ContentResolver аналогичен разрешению доменных имен, т. Е. Сопоставлению stackoverflow.com с 151.101.129.69. Роль ContentResolver на этом в значительной степени заканчивается. ContentProvider обслуживает содержимое для конкретного запроса, например предоставляет HTML-код для этого вопроса stackoverflow.com/questions/18874801. На самом деле это просто уровень абстракции для запросов к базе данных, игнорируя базовую реализацию.   -  person Aswath    schedule 02.06.2020


Ответы (4)


Я нашел объяснение здесь. В итоге

Content Resolver разрешает URI для определенного поставщика контента.

Поставщик контента предоставляет интерфейс для запроса контента.

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

person user1700184    schedule 18.09.2013
comment
›Если я хочу создать свой список воспроизведения, то должен ли я использовать Contentprovider ?? - person Akshay Mukadam; 18.09.2013
comment
да. Content Provider предоставляет содержимое приложения другим приложениям. Вы также можете использовать его для получения данных с веб-сервера. - person user1700184; 18.09.2013
comment
Хорошее объяснение! Но если бы автор сначала объяснил ContentProvider, это дало бы больше смысла и последовательности + больше понимания! Во всяком случае! Это проясняет мне идею :) - person Faizan Mubasher; 19.01.2014
comment
Просто добавить. ContentResolver особенно необходим, когда вы обращаетесь к другим поставщикам контента, чтобы иметь безопасный доступ. Если у вас есть собственный поставщик контента, вам не нужно его использовать. - person stdout; 27.06.2016

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

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

content: //com.android.contacts/contacts/3

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

введите описание изображения здесь

ПРИМЕЧАНИЕ. Ваше собственное приложение также может использовать этот маршрут для обработки своих данных.

Дополнительные сведения см. В разделе Content Provider в Android.

person Siva Prakash    schedule 12.11.2016
comment
Количество голосов показывает, что этот ответ должен был быть принятым. - person The_Martian; 29.07.2020
comment
Да, этот ответ более ясен, чем принятый ответ - person alu; 31.10.2020

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

ContentResolver -> ContentProvider -> SQLiteDatabase

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

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

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

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

Как тогда передаются данные?

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

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

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

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

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

person Rohit Singh    schedule 12.12.2017

В 2021 году: D

Content Resolver: для запроса данных

Поставщик контента: для ответа на запросы данных

person Zafar Iqbal    schedule 07.03.2020