В чем разница между ContentProviders и ContentResolver? Я не хочу SQLite
базу данных. Разрабатываю приложение для СМИ.
В чем разница между contentprovider и contentResolver в android
Ответы (4)
Я нашел объяснение здесь. В итоге
Content Resolver разрешает URI для определенного поставщика контента.
Поставщик контента предоставляет интерфейс для запроса контента.
Способ запроса к поставщику контента: contentResolverInstance.query(URI,.....)
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.
Двухслойная абстракция:
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 и т. д. Но это плохо документировано.
В 2021 году: D
Content Resolver: для запроса данных
Поставщик контента: для ответа на запросы данных