Сущность Контент-провайдеров
Суббота, Май 10th, 2008ENGLISH TRANSLATION FROM GOOGLE TRANSLATE
Контент-провайдер (Content Provider) представляет собой объект, который обеспечивает разделяемый (общий) доступ к различным данным (музыка, видео, изображения, информация о контактах) всем приложениям Android. Каждый контент-провайдер предоставляет пользователю уникальную строку ресурса (URI), которая определяет, каким типом данных управляет этот контент-провайдер. Таким образом, пользователь должен использовать эту строку, чтобы иметь возможность хранить или получать данные того или иного типа. Android имеет свои собственные контент-провайдеры, которые пользователь может использовать для получения системных настроек (класс Settings.System), информации о контактах (класс Contacts), последних телефонных звонках (класс CallLog.Calls) и т.д. Все системные контент-провайдеры (классы для их создания) хранятся в пакете android.provider.
Для удобной работы с URI в Android имеется класс-обертка android.net.Uri, при помощи которого вы можете удобно работать с URI-строкой. Строка URI состоит из трех частей: строки “content://”; части, которая описывает тип данных, и необязательной части, в которой указывается конкретный элемент выбранного типа данных. Ниже показаны примеры URI-строк:
content://contacts/people/ - список всех имен контактов
content://contacts/people/27 - имя контакта с идентификатором 27
В большинстве случаев вам не потребуется напрямую использовать строку URI. В каждом системном контент-провайдере имеется поле CONTENT_URI, которое хранит объект класса android.net.Uri, содержащий URI-строку тех данных, с которыми вы хотите работать. Если вам все-таки нужно изменить URI-строку, класс Uri имеет для этого специализированные методы.
Далее рассмотрим операции, которые можно производить над данными, предоставляемыми контент-провайдерами.
Запрос данных
Для запроса данных у контент-провайдера вы должны воспользоваться методом managedQuery, который возвращает управляемый курсор (Cursor). Курсор – это интерфейс для получения произвольного доступа к данным, возвращенным запросом. Управляемый курсор функционирует таким образом, что при ситуации, когда приложение приостанавливает свою работу, он корректно выгружает данные, а когда приложение снова запускается, данные перезапрашиваются. Получаемый набор данных представлен в виде таблицы, столбцами которой являются поля данных, что вы указывали при запросе, а строками – непосредственно сами данные.
Для получения данных из системных контент-провайдеров вам потребуется прописать пользовательские права для выполнения тех или иных действий над этими данными в файле AndroidManifest.xml. Например, для того, чтобы ваше приложение могло читать книгу контактов, вам нужно добавить право на их чтение android.permission.READ_CONTACTS.
Имена столбцов, порядок следования данных и их тип указаны непосредственно в контент-провайдере. В курсоре, помимо полей самих данных, всегда присутствуют служебные поля _id и _count, которые определяют порядковый номер элемента данных и общее количество элементов соответственно. Для удобства работы с системными контент-провайдерами существуют интерфейсы, в которых хранятся поля этих провайдеров. Например, поля _ID и _COUNT предоставляет интерфейс BaseColumns, а в интерфейсе Contacts.PeopleColumns можно получить информацию о полях NAME и PHOTO. Поле PHOTO содержит URI-строку, которая представляет собой путь к изображению персоны. Для работы с этими бинарными данными (изображением) применяются специфичные методы openInputStream() и openOutputStream() класса ContentResolver.
Ниже рассмотрен пример запроса данных о персонах (имя, телефоны, e-mail).








