что такое 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().
Русские Блоги
Примечания к исследованию Android 3 Content Provider из четырех основных компонентов
2016.7.24 Первое обновление: добавлен соответствующий контент пользовательского контент-провайдера, который полностью анализирует использование контент-провайдера.
Поставщик контента, поставщик контента, я думаю, что все знакомы с названием этого компонента. Может быть, я обычно делаю несколько простых приложений, поэтому я не очень часто использую контент-провайдера, и я не особенно знаком с ним. Но вот краткое резюме контент-провайдера, не очень глубокое, но я надеюсь помочь новичкам, в том числе и мне, после прочтения этого блога вы сможете получить общее представление об этом компоненте.
1. Что такое контент-провайдер
Компонент Content Provider представляет собой стандартный API для обмена данными между различными приложениями. Например, если приложение имеет некоторые данные, оно может разрешить другим приложениям доступ к данным, затем оно может предоставить интерфейс для доступа к этим данным через ContentProvider, а когда другие приложения хотят получить доступ к данным, оно может работать через ContentResolver, включая добавление Удалить, изменить и так далее.
Следующее содержание несколько абзацев на официальном документе.
When you want to access data in a content provider, you use the ContentResolver to communicate with the provider as a client. The ContentResolver object communicates with the provider object, an instance of a class that implements ContentProvider. The provider object receives data requests from clients, performs the requested action, and returns the results.
Если вы хотите получить доступ к данным провайдера контента, то вы, как клиентский клиент, используете преобразователь ContentResolver для взаимодействия с провайдером и объект ContentResolver для взаимодействия с классом, который реализует ContentProvider. Инстансы взаимодействуют, поставщик получает запрос данных клиента, а затем выполняет запрос и возвращает данные
Android itself includes content providers that manage data such as audio, video, images, and personal contact information. You can see some of them listed in the reference documentation for the android.provider package. With some restrictions, these providers are accessible to any Android application.
Сама Android содержит некоторых поставщиков контента для управления такими данными, как аудио (аудио), видео (видео), изображения (изображения) и контактная информация. Мы можем просмотреть их в пакете android.provider. Эти поставщики могут быть доступны любому приложению при определенных условиях.
2. Контент-провайдер прост в использовании
Ниже приведен простой пример: мы можем получить доступ к контактной информации в адресной книге системы через ContentResolver.
1. Создайте новый файл макета layout_activity_cp.xml
2. Новая активность
3. Добавьте разрешение на чтение контактов в файле манифеста AndroidManifest.xml и не забудьте зарегистрировать Activity.
Таким образом, после запуска проверьте результат вывода, как показано на рисунке ниже:
Здесь мы видим, что имена контактов в бюллетене были выведены. Если вы его не видите, не забудьте проверить, не добавлены ли контакты в вашу адресную книгу, ха-ха.
Приведенный выше код на самом деле выглядит очень просто, основная логика выглядит следующим образом:
В системе Android есть полный набор спецификаций для управления поставщиками контактного контента. Я не совсем разбираюсь в особенностях, но мы можем просто помнить, что контактные данные не существуют в Uri. Просто сейчас мы запрашиваем контакт. В сборе данных нет контактного номера в наборе результатов. Uri номера мобильного телефона контакта: ContactsContract.CommonDataKinds.Phone.CONTENT_URI.
Измените приведенный выше код следующим образом:
Там много кода, но если вы поясните логику, это легко понять. Я добавил подробные комментарии. Вот краткое резюме:
Три, настройка контент-провайдера
Вышеуказанный контент предназначен главным образом для доступа к данным в поставщике контента, определяемом системой.Если приложение, которое мы сами разрабатываем, должно делиться данными с другими приложениями и разрешать доступ другим приложениям, то мы можем сами создать провайдера контента для контроля Внешние визиты. Исходный код этой части приведен в конце статьи.
1. Шаги
2. Анализ использования
Создайте базу данных. База данных SQLite используется для сохранения данных здесь.
Создайте новый подкласс, унаследованный от ContentProvider, для выполнения основных операций.
Русские Блоги
ContentProvider для Android
1. Что такое контент-провайдер?
Контент-провайдер (Content Provider) в основном используется для реализации функции обмена данными между различными приложениями и предоставляет полный набор механизмов, позволяющих одной программе получать доступ к данным в другой программе, а также обеспечивает доступ к данным. безопасность. В настоящее время использование поставщиков контента является стандартным способом обмена данными между программами в Android.
В отличие от двух глобально читаемых и записываемых режимов работы в хранилище файлов и хранилище SharedPreferences, поставщики контента могут выбирать, какая часть данных является общей для обеспечения конфиденциальности данных в нашей программе. Нет риска утечки.
2. Использование контент-провайдеров
Мы обычно используем контент-провайдеров для запроса данных:
Cursor cursor = getContentResolver().query(final Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal)
Если вы написали код SQLite, вы должны быть хорошо знакомы с этим методом! Когда вы закончите читать принцип, лежащий в основе механизма ContentProvider, вы поймете это!
После получения строки URI содержимого нам также необходимо проанализировать ее в объект Uri, прежде чем она будет передана в качестве параметра. Метод синтаксического анализа также довольно прост: код выглядит следующим образом:
Просто вызовите статический метод Uri parse (), чтобы разобрать строку URI содержимого в объект URI.
Теперь мы можем запросить данные в таблице 1 через этот объект Uri. Код выглядит так:
Параметры, полученные методом query (), аналогичны параметрам, полученным методом query () в SQLiteDatabase, но в целом это немного проще: в конце концов, это доступ к данным в других программах. Нет необходимости создавать сложные операторы запроса. Индексы подробно объясняют параметры, полученные запросом в поставщике контента:
После того, как запрос завершен, объект Cursor по-прежнему возвращается.В настоящее время мы можем читать данные по одному из объекта Cursor. Идея чтения по-прежнему состоит в том, чтобы обойти этот объект Cursor и затем извлечь данные один за другим, код выглядит следующим образом:
Запрос будет выполнен, поэтому оставшиеся добавления, удаления и модификации, естественно, не нужны. Код выглядит следующим образом:
3. Как создать контент-провайдер из собственного приложения?
Как упоминалось ранее, если вы хотите реализовать функцию совместного использования данных между программами, официально рекомендованным способом является использование поставщика контента. Вы можете создать новый класс для наследования класса ContentProvider для создания своего собственного поставщика контента. Класс ContentProvider имеет 6 абстрактных методов. Когда мы наследуем его от подкласса, нам нужно переписать все 6 методов. Новый MyProvider наследует класс ContentProvider. Код выглядит следующим образом:
Я полагаю, что из этих 6 методов, помимо методов, которые вы можете использовать для добавления, удаления, изменения и проверки, вы можете не знать оставшиеся два метода. Ниже описываются эти методы один за другим:
1.onCreate () метод:
Вызывается при инициализации поставщика контента. Операции создания и обновления базы данных обычно выполняются здесь. Возвращает true, если поставщик содержимого был успешно инициализирован, или false, если произошел сбой. Обратите внимание, что поставщик контента будет инициализирован только тогда, когда ContentResolver пытается получить доступ к данным в нашей программе.
3.insert () метод:
Добавьте часть данных поставщику контента. Для определения добавляемой таблицы используйте параметр uri. Данные для добавления сохраняются в параметре values. После завершения добавления верните URI, представляющий эту новую запись.
4.update () метод:
Обновите существующие данные в поставщике контента. Используйте параметр uri, чтобы определить, какие данные таблицы обновляются. Новые данные сохраняются в параметре values. Параметры selection и selectionArgs используются для ограничения того, какие строки обновляются. Число затронутых строк будет возвращено в качестве возвращаемого значения.
5.delete () метод:
Удалить данные из контент-провайдера. Используйте параметр uri, чтобы определить, какие данные таблицы удаляются. Параметры selection и selectionArgs используются для ограничения того, какие строки удаляются. Количество удаленных строк возвращается в качестве возвращаемого значения.
6. getType () метод:
Возвращает соответствующий тип MIME на основе переданного URI содержимого.
Вы можете видеть, что почти каждый метод будет принимать параметр Uri, который также является параметром, который передается при вызове методов добавления, удаления и изменения ContentResolver. Теперь нам нужно проанализировать входящие параметры Uri и проанализировать таблицы и данные, к которым ожидает доступ вызывающая сторона.
Напомним, что стандартный URI контента записывается так:
Это означает, что вызывающая сторона ожидает доступа к данным в таблице table1 приложения com.example.app. Кроме того, мы можем добавить идентификатор после URI содержимого, как показано ниже:
Это означает, что вызывающая сторона ожидает доступа к данным с идентификатором 1 в таблице table1 приложения com.example.app.
Формат URI содержимого в основном включает два вышеуказанных типа: конец пути указывает, что вы хотите получить доступ ко всем данным в таблице, а результат id указывает, что вы хотите получить доступ к данным с соответствующим идентификатором в таблице. Мы можем использовать подстановочные знаки для сопоставления URI контента в этих двух форматах. Правила следующие:
Таким образом, формат URI контента, который соответствует любой таблице, может быть записан как:
Формат URI контента, который соответствует любой строке данных в таблице, может быть записан как:
Приведенный выше код является просто демонстрацией с использованием метода query () в качестве примера. На самом деле реализация метода insert (), update (), delete () похожа на метод query (), все они содержат параметр Uri, а затем один и тот же Используйте метод match () UriMatcher, чтобы определить, к какой таблице хочет обратиться вызывающий объект, а затем выполните соответствующие операции с данными в таблице.
Кроме того, есть еще один метод, с которым вы не знакомы. Это метод getType (). Это метод, который все поставщики контента должны предоставить, чтобы получить тип MIME, соответствующий объекту Uri. Строка MIME, соответствующая URI контента, в основном состоит из 3 частей. Android определил следующий формат для этих 3 частей:
Таким образом, для содержимого URI содержимого: //com.example.app.provider/table1 его соответствующий тип MIME можно записать в виде:
Для содержимого URI содержимого: //com.example.app.provider/table1/1 соответствующий ему тип MIME можно записать в виде:
Теперь мы можем продолжить улучшать содержимое в классе MyProvider. На этот раз для реализации логики метода getType () код выглядит следующим образом:
Здесь создается полный поставщик контента, и теперь можно использовать любое приложение.
ContentResolver для доступа к данным в нашей программе. Итак, как мы можем гарантировать, что личные данные не будут вытекать? На самом деле, эта проблема была решена неосознанно благодаря хорошему механизму поставщика контента. Поскольку все операции CRUD должны выполняться путем сопоставления соответствующего формата URI контента, и, конечно, мы не можем добавить URI личных данных в UriMatcher, поэтому внешние части этой программы вообще не могут быть доступны внешним программам, и проблемы безопасности не Он существует.
Хорошо, вы уже знаете шаги по созданию провайдера контента. Давайте посмотрим на него и познакомимся с другими людьми.
Функция обмена данными последовательности.
Это еще не конец? Все мы знаем, что четыре основных компонента должны быть зарегистрированы в файле AndroidManifest.xml. Теперь, когда законченный поставщик контента записан, следующим шагом является регистрация в файле AndroidManifest.xml, после чего можно использовать поставщик контента. Давайте рассмотрим пример. Код упаковки стандартного поставщика контента выглядит следующим образом:
Зарегистрируйте поставщика содержимого в файле AndroidManifest.xml с тегами
Это завершает процесс создания полного поставщика контента.
4. Принципиальный механизм работы ContentPrivoder
На самом деле, к поставщикам контента можно обращаться по всем программам, что можно рассматривать как способ межпроцессного взаимодействия. Фактически, ядром его принципа является Binder.
В чем разница между contentprovider и contentResolver в Android
В чем разница между работы контентпровайдеров и ContentResolver? Я не хочу, чтобы к базе данных SQLite с`. Я занимаюсь разработкой приложения для СМИ.
Я нашел какое-то объяснение здесь. В резюме
Сельсин содержание устраняет URI для конкретного контент-провайдера.
Контент-провайдер предоставляет интерфейс к содержанию запроса.
Путь к запрос контент-провайдеру является contentResolverInstance.запрос(Ури. )`
`Работы контентпровайдеров используются в реферат базы данных из других частей и выступает в качестве интерфейса между базой данных и пользовательского интерфейса/других классов. Вы должны создать свой собственный ContentProvider чтобы поделиться своим приложением данных с другими приложениями.
Примечание : ваши собственные приложения также могут использовать этот маршрут для обработки данных.
Двухслойная абстракции :
главное отличие это как уже упоминалось в других ответов.
ContentProvider предоставляет личные данные из вашего приложения для наружного применения а ContentResolver предоставляет право ContentProvider среди всех работы контентпровайдеров с использованием Ури.
Глубокое понимание (двухслойный абстракция)
Позвольте’s сделать крюк. Мы все знаем, что когда мы создаем базу данных SQLite база данных остается только приложение значит, вы просто не сможете поделиться вашим приложением данных с любого другого внешнего приложения.
Как данные передаются тогда?
что происходит, когда getContentResolver().запрос(Ури,строка[] прое. ) вызывается
запросов (метод) принадлежит ContentResolver класса, однако он вызывает абстрактный метод query() решен ContentProvider и возвращает объект Курсора. Таким образом, внешнее приложение подвержено влиянию собственной базе через два слоя абстракции.
просто, чтобы добавить больше очков Вы не можете создать свой собственный класс ContentResolver, но вы всегда можете создать свой собственный класс ContentProvider
Надеюсь, у вас есть лучшее понимание Вы также можете увидеть некоторые примеры кода здесь для создания журнала, ContentProvider и т. д., Но это’s не хорошо документированы.
Введение в ContentProvider
Для упрощения доступа к общим данным, таким как файлы мультимедиа, контакты и сведения о календаре, операционная система Android использует поставщики содержимого. В этой статье представлен класс ContentProvider, а также два примера его использования.
Общие сведения о поставщиках содержимого
Поставщик содержимого инкапсулирует репозиторий данных и предоставляет API для доступа к нему. Поставщик существует как часть приложения Android, которая обычно также предоставляет пользовательский интерфейс для отображения данных и управления ими. Основное преимущество поставщика содержимого заключается в том, что другие приложения могут легко получать доступ к инкапсулированным данным с помощью клиентского объекта поставщика (называемого ContentResolver). Вместе поставщик и сопоставитель содержимого обеспечивают единообразный работающий между приложениями API для доступа к данным. Этот API прост в создании и использовании. Любое приложение может использовать ContentProviders для внутреннего управления данными, а также для их предоставления другим приложениям.
ContentProvider также необходимо для приложения, чтобы предоставить настраиваемые варианты поиска, или если вы хотите предоставить возможность копирования сложных данных из приложения для вставки в другие приложения. В этом документе показано, как получить доступ к ContentProviders и создавать его с помощью Xamarin.Android.
Эта статья имеет следующую структуру.
Принцип работы – обзор того, для чего предназначен ContentProvider и как он работает.
Использование поставщика содержимого – пример доступа к списку контактов.
Использование ContentProvider для совместного использования данных – запись и использование ContentProvider в одном приложении.
ContentProviders и курсоры, работающие с их данными, часто используются для заполнения ListViews. Дополнительные сведения об использовании этих классов см. в руководстве Xamarin.Android ListView.
Настраиваемые классы ContentProviders — это удобный способ упаковки данных для использования в собственном приложении или для использования другими приложениями (включая особые варианты использования, такие как пользовательский поиск и копирование или вставка).