Файлы System/bin Android 12. Справочник.


  Все     Команда     Скрипт     Служба     Приложение  

content
Работа с контент-провайдером

Тип файла: приложение
  Eng  


Этот класс представляет собой утилиту командной строки для управления содержимым.
Клиент может вставлять, обновлять и удалять записи в поставщике контента.
Например, некоторые параметры можно настроить перед запуском тестов CTS и т.д.

Контент-провайдер (если упрощенно) - это как-бы интерфейс между приложением и базой данных.

   

Комментарии
https://developer.alexanderklimov.ru/android/theory/contentprovider.php
Что такое контент-провайдер

Контент-провайдер или "Поставщик содержимого" (Content Provider) - это оболочка (wrapper), в которую заключены данные. Если ваше приложение использует базу данных SQLite, то только ваше приложение имеет к ней доступ. Но бывают ситуации, когда данные желательно сделать общими. Простой пример - ваши контакты из телефонной книги тоже содержатся в базе данных, но вы хотите иметь доступ к данным, чтобы ваше приложение тоже могло выводить список контактов. Так как вы не имеете доступа к базе данных чужого приложения, был придуман специальный механизм, позволяющий делиться своими данными всем желающим.

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

В Android существует возможность выражения источников данных (или поставщиков данных) при помощи передачи состояния представления - REST, в виде абстракций, называемых поставщиками содержимого. Базу данных SQLite можно заключить в поставщик содержимого. Чтобы получить данные из поставщика содержимого или сохранить в нём новую информацию, нужно использовать набор REST-подобных идентификаторов URI. Например, если бы вам было нужно получить набор книг из поставщика содержимого, в котором заключена электронная библиотека, вам понадобился бы такой URI (по сути запрос к получению всех записей таблицы books):

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

content://com.android.book.bookProvider/books/23
Любая программа, работающая в устройстве, может использовать такие URI для доступа к данным и осуществления с ними определенных операций. Следовательно, поставщики содержимого играют важную роль при совместном использовании данных несколькими приложениями.

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

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

Browser
CallLog
Contacts
People
Phones
Photos
Groups
MediaStore
Audio
Albums
Artists
Genres
Playlists
Images
Thumbnails
Video
Settings
На верхних уровнях иерархии располагаются базы данных, на нижних - таблицы. Так, Browser, СаllLog, Contacts, MediaStore и Settings - это отдельные базы данных SQLite, инкапсулированные в форме поставщиков. Обычно такие базы данных SQLite имеют расширение DB и доступ к ним открыт только из специальных пакетов реализации (implerentation package). Любой доступ к базе данных из-за пределов этого пакета осуществляется через интерфейс поставщика содержимого.

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

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


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

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


<provider
android:name:".MyContentProvider"
android:authorities="ru.alexanderklimov.provider.notepad" />
Источник поставщика содержимого аналогичен доменному имени сайта. Если источник уже зарегистрирован, эти поставщики содержимого будут представлены гиперссылками, начинающимися с соответствующего префикса источника:


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

Необходимо отметить, что поставщики содержимого, используемые в Android, могут иметь неполное имя источника. Полное имя источника рекомендуется использовать только со сторонними поставщиками содержимого. Поэтому вам иногда могут встретиться поставщики содержимого, состоящие из одного слова, например contacts, в то время как полное имя такого поставщика содержимого - com.google.android.contacts.

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


content://ru.alexanderklimov.provider.notepad/notes
URI для идентификации отдельно взятой записи будет иметь вид:


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


content://media/internal/images
content://media/external/images
content://contacts/people/
content://contacts/people/23
Обратите внимание - здесь поставщики содержимого content://media и content://contacts имеют неполную структуру. Это обусловлено тем, что данные поставщики содержимого не являются сторонними и контролируются Android.



Из чего состоит Content URI?

URI – Uniform Resource Identifier.
URI контента в андроиде – это объект класса Uri, который имеет структуру content://{authority}/{path}/{id}.

content: – это схема. Константа content определена в документации как SCHEME_CONTENT. Именно схема говорит, что данный URI – это URI контента, а не, например, файла.

authority – идентифицирует ContentProvider. Обрабатывая запросы, ContentResolver использует authority, чтобы найти ContentProvider в системной таблице зарегистрированных провайдеров. После этого запросы делегируются в провайдер.

path используется контент провайдером, чтобы определить путь к данным. Обычно path соответствует названиям таблиц, используемых провайдером.

id – опциональная часть content URI и поддерживается не всеми провайдерами. Определяет строку в таблице провайдера. Метод insert() возвращает URI, содержащий id созданной строки.

Примеры content URI таблиц провайдера календарей:
Таблица календарей: content://com.android.calendar/calendars
Таблица событий: content://com.android.calendar/events