что такое contentprovider и contentresolver

Content provider (Контент-провайдер)

Что такое контент-провайдер

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

Чтобы получить из библиотеки конкретную книгу (например, книгу №23), будет использоваться следующий URI (отдельный ряд таблицы):

Любая программа, работающая в устройстве, может использовать такие URI для доступа к данным и осуществления с ними определенных операций. Следовательно, поставщики содержимого играют важную роль при совместном использовании данных несколькими приложениями.

Встроенные поставщики

В Android используются встроенные поставщики содержимого (пакет android.provider). Вот неполный список поставщиков содержимого:

Создание собственного контент-провайдера

Для создания собственного контент-провайдера нужно унаследоваться от абстрактного класса ContentProvider:

В классе необходимо реализовать абстрактные методы query(), insert(), update(), delete(), getType(), onCreate(). Прослеживается некоторое сходство с созданием обычной базы данных.

А также его следует зарегистрировать в манифесте с помощью тега provider с атрибутами name и authorities. Тег authorities служит для описания базового пути URI, по которому ContentResolver может найти базу данных для взаимодействия. Данный тег должен быть уникальным, поэтому рекомендуется использовать имя вашего пакета, чтобы не произошло путаницы с другими приложениями, например:

Источник поставщика содержимого аналогичен доменному имени сайта. Если источник уже зарегистрирован, эти поставщики содержимого будут представлены гиперссылками, начинающимися с соответствующего префикса источника:

Итак, поставщики содержимого, как и веб-сайты, имеют базовое доменное имя, действующее как стартовая URL-страница.

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

URI для идентификации отдельно взятой записи будет иметь вид:

Символ # соответствует конкретной записи (ряд таблицы). Ниже приведено еще несколько примеров URI, которые могут присутствовать в поставщиках содержимого:

Структура унифицированных идентификаторов содержимого (Content URI)

Для получения данных из поставщика содержимого нужно просто активировать URI. Однако при работе с поставщиком содержимого найденные таким образом данные представлены как набор строк и столбцов и образуют объект Android cursor. Рассмотрим структуру URI, которую можно использовать для получения данных.

Унифицированные идентификаторы содержимого (Content URI) в Android напоминают HTTP URI, но начинаются с content и строятся по следующему образцу:

Вот пример URI, при помощи которого в базе данных идентифицируется запись, имеющая номер 23:

После content: в URI содержится унифицированный идентификатор источника, который используется для нахождения поставщика содержимого в соответствующем реестре. Часть URI ru.alexanderklimov.provider.notepad представляет собой источник.

UriMatcher

Провайдер имеет специальный объект класса UriMatcher, который получает данные снаружи и на основе полученной информации создаёт нужный запрос к базе данных.

URI pattern Code Contant name
content://ru.alexanderklimov.provider.notepad/notes 100 NOTES
content://ru.alexanderklimov.provider.notepad/notes/# 101 NOTES_ID

Приложение может быть сложным и иметь несколько таблиц. Тогда и констант будет больше. Например, так.

URI pattern Code Contant name
content://com.android.contacts/contacts 1000 CONTACTS
content://com.android.contacts/contacts/# 1001 CONTACTS_ID
content://com.android.contacts/lookup/* 1002 CONTACTS_LOOKUP
content://com.android.contacts/lookup/*/# 1003 CONTACTS_LOOKUP_ID
. . .
content://com.android.contacts/data 3000 DATA
content://com.android.contacts/data/# 3001 DATA_ID
. . .

Символ решётки (#) отвечает за число, а символ звёздочки (*) за строку.

Метод query()

Метод query() является обязательным для класса ContentProvider. Если мы используем контент-провайдер для обращения к базе данных, то в нём вызывает одноимённый метод SQLiteDatabase. Состав метода практически идентичен.

Читайте также:  Кашляю ночью а днем нет что это

Вам нужно программно получить необходимые данные для аргументов метода. Обратите внимание на метод ContentUris.parseId(uri), который возвращает последний сегмент адреса, в нашем случае число 3, для Selection Args.

Метод insert()

Для вставки используется вспомогательный метод insertGuest().

Структурирование МIМЕ-типов в Android

Как веб-сайт возвращает тип MIME для заданной гиперссылки (это позволяет браузеру активировать программу, предназначенную для просмотра того или иного типа контента), так и в поставщике содержимого предусмотрена возможность возвращения типа MIME для заданного URI. Благодаря этому достигается определенная гибкость при просмотре данных. Если мы знаем, данные какого именно типа получим, то можем выбрать одну или несколько программ, предназначенных для представления таких данных. Например, если на жестком диске компьютера есть текстовый файл, мы можем выбрать несколько редакторов, которые способны его отобразить.

Типы MIME работают в Android почти так же, как и в НТТР. Вы запрашиваете у контент-провайдера тип MIME определенного поддерживаемого им URI, и поставщик содержимого возвращает двухчастную последовательность символов, идентифицирующую тип MIME в соответствии с принятыми стандартами.

Обозначение MIME состоит из двух частей: типа и подтипа. Ниже приведены примеры некоторых известных пар типов и подтипов MIME:

text/html
text/css
text/xml
image/jpeg
audio/mp3
video/mp4
application/pdf
application/msword

Основные зарегистрированные типы содержимого:

application
audio
image
message
model
multipart
text
video

В Android применяется схожий принцип для определения типов MIME. Обозначение vnd в типах MIME в Android означает, что данные типы и подтипы являются нестандартными, зависящими от производителя. Для обеспечения уникальности в Android типы и подтипы разграничиваются при помощи нескольких компонентов, как и доменные имена. Кроме того, типы MIME в Android, соответствующие каждому типу содержимого, существуют в двух формах: для одиночной записи и для нескольких записей.

ContentResolver

Каждый объект Content, принадлежащий приложению, включает в себя экземпляр класса ContentResolver, который можно получить через метод getContentResolver().

Источник

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

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

5 ответов

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  как открыть долларовый счет в киви кошельке

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

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

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

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

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

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

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

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

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

Источник

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

ОТВЕТЫ

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Вы можете легко понять это,

Ответ 4

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

ContentResolver → ContentProvider → SQLiteDatabase

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

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

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

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

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

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

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

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

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

Источник

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

В чем разница между работы контентпровайдеров и ContentResolver? Я не хочу, чтобы к базе данных SQLite с`. Я занимаюсь разработкой приложения для СМИ.

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

Сельсин содержание устраняет URI для конкретного контент-провайдера.

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

Читайте также:  как пополнить лицевой счет мегафона

Путь к запрос контент-провайдеру является contentResolverInstance.запрос(Ури. )`

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

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

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

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

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

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

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

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

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

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

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

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

Источник

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

ОТВЕТЫ

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

Вы можете легко понять это,

Ответ 4

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

ContentResolver → ContentProvider → SQLiteDatabase

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

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

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

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

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

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

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

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

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

Источник

Академический образовательный портал