Создание компонента Content Provider



Content Provider — это единственный способ совместного использования данныхмежду Android-приложениями. Если нужно предоставить доступ к своим даннымдля других приложений, необходимо предпринять следующие шаги:

r создать собственный Content Provider, как подкласс класса ContentProvider;

r объявить Content Provider в файле манифеста приложения;

r реализовать в клиентском приложении функциональность для доступа к Content

Provider.

Все Content Provider предоставляют общий интерфейс для запросов данных клиентскими приложениями — на чтение, добавление, изменение и удаление данных.

Content Provider представляют данные в виде плоской таблицы. Каждая запись обязательно включает числовое поле _ID, которое уникально идентифицирует запись впределах таблицы. Идентификаторы могут использоваться для соответствия строкв связанных таблицах — например, чтобы находить номер телефона человека в одной таблице и фотографию того же человека в другой.

Расширение класса ContentProvider

Библиотека Android SDK предоставляет класс ContentProvider, который расположен в пакете android.content. Этот класс является абстрактным и напрямую в кодеприложения не используется, необходимо создавать собственную реализациюкласса, расширяющего ContentProvider. В классе, наследуемом от ContentProvider,в зависимости от того, как будет использоваться база данных, потребуется реализовать следующие методы:

r query() — для возвращения данных вызывающей программе;

r insert() — для вставки новых данных в Content Provider;

r update() — для обновления существующих данных в Content Provider;

r delete() — для удаления данных в Content Provider;

r getType() — для возвращения типа MIME данных в Content Provider. Этот метод реализовывать необязательно, если в нем нет необходимости.

URI

Каждый Content Provider предоставляет открытый URI (обернутый как объектURI), что уникально идентифицирует его набор данных. Content Provider, которыйуправляет множественными наборами данных (множественными таблицами), должен предоставлять отдельные URI для каждого набора данных. Все URI для провайдеров начинаются со строки "content://".

При определении Content Provider, как правило, определяют константу для URI.

Android определяет константы URI для всех провайдеров, которые идут с платформой. Константа URI состоит из четырех частей, которые показаны на рис. 15.8.

Эти части URI предоставляют следующие сведения:

r A — стандартный префикс, указывающий, что данные предоставляются Content

Provider. Этот префикс никогда не изменяется;

r B — часть URI, который идентифицирует Content Provider. Для сторонних при-

ложений он должен быть именем пакета и класса (в нижнем регистре), чтобы га-

рантировать свою уникальность среди других URI;

r C — путь, который Content Provider использует, чтобы определить требуемые

наборы данных. Если Content Provider предоставляет только один тип данных,

эта часть URI может отсутствовать. Если провайдер предоставляет данные не-

скольких типов, включая и подтипы, то эта часть URI будет, например, выглядеть

так: contacts/photos илиcontacts/birthday;

r D — идентификатор конкретной записи. Это и есть _ID записи. Если запрос не

ограничивается одной записью, эта часть URI пропускается:

content://com.samples.app.contactprovider/contacts

При запросе система анализирует URI и передает запрос этому Content Provider.Сам объект ContentProvider не используется напрямую. Клиентские приложениявызывают Content Provider через объект класса ContentResolver. Получить экземпляр ContentResolver можно через вызов метода getContentResolver() в классеActivity или другого компонента Android-приложения:ContentResolver resolver = getContentResolver();

Этот класс содержит большое количество методов для работы с содержимым базыданных. В клиентском приложении можно использовать методы ContentResolverдля взаимодействия с любыми Content Provider, которые доступны и требуются для работы приложения с данными.

В теле метода onCreate(), который вызывается системой при создании экземпляра Content Provider, инициализируется объект SQLiteDatabase.

Для чтения данных используют вызов метода query(), который объявляется так:

Cursor query (String table, String[] columns,

String selection, String[] selectionArgs,

String groupBy, String having, String sortOrder)

В метод query() передают семь параметров:

r table — имя таблицы, к которой передается запрос;

r columns — список имен возвращаемых полей. При передаче null возвращаются

все столбцы;

r selection — параметр, формирующий выражение WHERE (исключая сам оператор

WHERE). Значение null возвращает все строки;

r selectionArgs — значения аргументов фильтра для оператора WHERE;

r groupBy — параметр, формирующий выражение GROUP BY (исключая сам опера-

тор GROUP BY). Если GROUP BY не нужен, передается null;

r having — параметр, формирующий выражение HAVING (исключая сам оператор

HAVING). Если не нужен, передается null;

r sortOrder — параметр, форматирующий выражение ORDER BY (исключая сам

оператор ORDER BY). При сортировке по умолчанию передается null.

Для вставки новой записи в базу данных SQLite используется метод insert(). Этот

методобъявленследующимобразом:

long insert (String table, String nullColumnHack, ContentValues values)

Для обновления записей в базе данных применяют метод update() класса

SQLiteDatabase:

int update (String table, ContentValues values,

String whereClause, String[] whereArgs)

Для удаления записей в базе данных используют метод delete():

int delete (String table, String whereClause, String[] whereArgs)

 

Чтобы система Android могла узнать о Content Provider, который вы разработали,необходимо задекларировать его в элементе <provider>в файлеAndroidManifest.xml. Content Provider, которые не объявлены в декларации, не видимы в системе Android, и обращение к ним сгенерирует исключение во время выполнения программы.

При объявлении Content Provider необходимо в атрибуте android:name указать имя

класса, реализующего Content Provider, ватрибутеandroid:authorities — URI, по

которому будут обращаться приложения для доступа к базе данных.

Чтобы сделать запрос к Content Provider из клиентского приложения, необходимытри обязательных параметра: URI, который идентифицирует провайдера, имена запрашиваемых полей данных и типы данных для этих полей.

 

Чтобы сделать запрос к Content Provider, в клиентском приложении используют метод Activity.managedQuery():

Cursor managedQuery (Uri uri, String[] projection,

String selection, String[] selectionArgs, String sortOrder)

Оба метода принимают один и тот же набор параметров и возвращают объект Cursor. Однако метод managedQuery() заставляет Activity управлять циклом жизни объекта Cursor аналогично жизненному циклу самой деятельности.

Чтобы добавить новую запись в Content Provider, сначала надо создать объект Map — карту с парами ключ-значение в объекте ContentValues, где каждый ключ соответствует имени столбца в Content Provider, а значение — конкретным данным для новой записи в этом столбце. После этого вызывается метод ContentResolver.insert(), которому надо передать URI провайдера и созданный объект ContentValues.


Дата добавления: 2018-06-27; просмотров: 349; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!