Доброго времени суток, уважаемые Хабровчане!
Как все вы знаете — Android это потенциально развивающаяся и конкуретноспособная операционная система. Разработчиков под эту систему с каждым днем ставновится все больше и больше. Хоть я и начинающий разработчик под Android, я не буду рассказывать вам, как установить Eclipse и ADT под него.
В этом топике я хотел бы рассказать о поставщиках содержимого в операционной системе Android и привести небольшой пример работы с одним из них.
Что такое поставщики содержимого
Поставщики содержимого (content providers) — сущности предназначенные для обобщения данных в службах. Благодаря применению поставщиков содержимого источники данных становятся похожи на оснащенные функциями передачи состояния представления (REST) поставщики данных
Что такое REST
REST (Representational state transfer) – это стиль архитектуры программного обеспечения для распределенных систем, таких как World Wide Web, который, как правило, используется для построения веб-служб. Термин REST был введен в 2000 году Роем Филдингом, одним из авторов HTTP-протокола. Системы, поддерживающие REST, называются RESTful-системами.
В общем случае REST является очень простым интерфейсом управления информацией без использования каких-то дополнительных внутренних прослоек. Каждая единица информации однозначно определяется глобальным идентификатором, таким как URL. Каждая URL в свою очередь имеет строго заданный формат.
А теперь тоже самое более наглядно:
Отсутствие дополнительных внутренних прослоек означает передачу данных в том же виде, что и сами данные. Т.е. мы не заворачиваем данные в XML, как это делает SOAP и XML-RPC, не используем AMF, как это делает Flash и т.д. Просто отдаем сами данные.
Каждая единица информации однозначно определяется URL – это значит, что URL по сути является первичным ключом для единицы данных. Т.е. например третья книга с книжной полки будет иметь вид /book/3, а 35 страница в этой книге — /book/3/page/35. Отсюда и получается строго заданный формат. Причем совершенно не имеет значения, в каком формате находятся данные по адресу /book/3/page/35 – это может быть и HTML, и отсканированная копия в виде jpeg-файла, и документ Microsoft Word.
Как происходит управление информацией сервиса – это целиком и полностью основывается на протоколе передачи данных. Наиболее распространенный протокол конечно же HTTP. Так вот, для HTTP действие над данными задается с помощью методов: GET (получить), PUT (добавить, заменить), POST (добавить, изменить, удалить), DELETE (удалить). Таким образом, действия CRUD (Create-Read-Update-Delete) могут выполняться как со всеми 4-мя методами, так и только с помощью GET и POST.
Вот как это будет выглядеть на примере:
GET /book/ — получить список всех книг
GET /book/3/ — получить книгу номер 3
PUT /book/ — добавить книгу (данные в теле запроса)
POST /book/3 – изменить книгу (данные в теле запроса)
DELETE /book/3 – удалить книгу
Виды стандартных поставщиков содержимого в Android
- Browser - CallLog - Contacts - People - Phones - Photos - Groups - MediaStore - Audio - Albums - Artists - Genres - Playlists - Images - Thumbnails - Video - Settings
На верхних уровнях иерархии распологаются базы данных SQLite, на нижних — таблицы. Следовательно — Browser, CallLog, Contacts, MediaStore, Settings — это отдельные базы данных SQLite, инкапсулированные в форме поставщиков.
Архитектура поставщиков содержимого
Каждый поставщик содержимого регистрируется в устройстве как веб-сайт, при помощи специальной строки (она похожа на доменное имя и называется authority). Такая уникальная последовательность набора символов в устройстве представляет собой основу для набора URI.
Регистрация источника осуществляется в файле AndroidManifest.xml. Ниже приведено два примера, как можно регистрировать поставщиков содержимого в Android.
<provider android:name = "SomeProvider" android:authorities = "com.YourApplication.SomeProvider" />
<provider android:name = "NotePadProvider" android:authorities = "com.google.provider.NotePad" />
В поставщиках содержимого также будут встречаться подобные REST ссылки для получения содержимого:
content://com.google.provider.NotePad/notes/ — получение всех записей
content://com.google.provider.NotePad/notes/# — получение одной записи по ID
Ниже приведено еще несколько URI для поставщиков содержимого
content://media/internal/images/
content://media/external/images/
content://contacts/people/
content://contacts/people/23
Здесь поставщики (content://media/) и (content://contacts) имеют не полную структуру, это означает, что данные поставщики содержимого не являются сторонними и контролируются системой Android.
Рассмотрим конкретный URI более детально:
content://com.google.provider.NotePad/notes/23
После content: в URI содержится унифицированный идентификатор источника, который используется для нахождения поставщика содержимого в соответствующем реестре.
В данном URI часть com.google.provider.NotePad представляет собой источник.
/notes/23 — это раздел пути (path section), специфичный для каждого отдельного поставщика содержимого
Считывание данных контактов при помощи URI
Важно помнить о системе безопасности в Android, поэтому в файл AndroidManifest.xml добавим:
<uses-permission android:name="android.permission.READ_CONTACTS" />
Более подробно о правах доступа можно почитать тут
Рассмотрим следующие URI
People.CONTENT_URI
Эквивалентная текстовая URI строка будет иметь вид:
content://contacts/people/
При использовании таких URI код для получения строк будет иметь следующий вид:
/* Создаем новый управляемый курсор */
Cursor managedCursor = managedQuery(People.CONTENT_URI,
new String[]
{
People._ID,
People.NAME,
People.NUMBER
}, // Какие колонки возвращать
null, // Какие строки возвращать(все)
null, // Выбор аргументов
People.NAME + " ASC"); // Метод сортировки
// Начинаем управлять курсором:
startManagingCursor(managedCursor);
// Проверяем, есть ли в курсоре строки
if (managedCursor.getCount() > 0)
{
while (managedCursor.moveToNext())
{
// Посылаем сообщение в дебагер
Log.i("DATA", managedCursor.getString(0) + " :: " // Полученное значение _ID
+ managedCursor.getString(1) + " " // Полученное значение NAME
+ managedCursor.getString(2)); // Полученное значение NUMBER
}
}
Подробнее про курсоры тут.