Pull to refresh

Поставщики содержимого. Взаимодействие с контактами

Development for Android
Sandbox
image
Доброго времени суток, уважаемые Хабровчане!

Как все вы знаете — Android это потенциально развивающаяся и конкуретноспособная операционная система. Разработчиков под эту систему с каждым днем ставновится все больше и больше. Хоть я и начинающий разработчик под Android, я не буду рассказывать вам, как установить Eclipse и ADT под него.

В этом топике я хотел бы рассказать о поставщиках содержимого в операционной системе Android и привести небольшой пример работы с одним из них.



Что такое поставщики содержимого

Поставщики содержимого (content providers) — сущности предназначенные для обобщения данных в службах. Благодаря применению поставщиков содержимого источники данных становятся похожи на оснащенные функциями передачи состояния представления (REST) поставщики данных
image



Что такое 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
	  }
        }	


Подробнее про курсоры тут.
Tags:androidandroid development
Hubs: Development for Android
Total votes 26: ↑24 and ↓2 +22
Views3.9K

Popular right now

Android developer
from 120,000 to 230,000 ₽EmphasoftRemote job
Android разработчик
from 70,000 ₽Magnum Hunt Executive SearchМосква
Android Developer
from 250,000 to 350,000 ₽AvatarifyRemote job
Android developer
from 130,000 ₽СберЛогистикаRemote job
Android разработчик
from 100,000 ₽ArtezioНижний Новгород

Top of the last 24 hours