Создание заглушки поставщика контента

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

Если вы разрабатываете новостное приложение, которое передает данные с сервера на устройство, вы должны серьезно рассмотреть хранения локальных данных с использованием провайдера контента. Кроме его важности для адаптеров синхронизации, провайдеры контента предлагают различные преимущества в безопасности и специально разработаны для хранения данных на Android системах. Чтобы узнать больше о создании поставщика контента, см. Создание поставщика контента.

Тем не менее, если вы уже храните локальные данные другим способом, вы все еще можете использовать адаптер синхронизации для обработки передачи данных. Чтобы удовлетворить требование платформы для провайдера контента, добавьте заглушки для провайдера контента для вашего приложения. Заглушка поставщика реализует класс поставщика контента, но все его методы возвращают null или 0. Если добавить заглушку поставщика, вы можете использовать адаптер синхронизации для передачи данных из любого хранилища, который вы выберете.

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

Добавление заглушки поставщика контента

Чтобы создать заглушку поставщика контента для вашего приложения, расширьте класс ContentProvider и создайте заглушки для требуемых методов. Следующий фрагмент показывает, как создать заглушку провайдера:

/*
 * Define an implementation of ContentProvider that stubs out
 * all methods
 */
public class StubProvider extends ContentProvider {
    /*
     * Always return true, indicating that the
     * provider loaded correctly.
     */
    @Override
    public boolean onCreate() {
        return true;
    }
    /*
     * Return an empty String for MIME type
     */
    @Override
    public String getType() {
        return new String();
    }
    /*
     * query() always returns no results
     *
     */
    @Override
    public Cursor query(
            Uri uri,
            String[] projection,
            String selection,
            String[] selectionArgs,
            String sortOrder) {
        return null;
    }
    /*
     * insert() always returns null (no URI)
     */
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }
    /*
     * delete() always returns "no rows affected" (0)
     */
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        return 0;
    }
    /*
     * update() always returns "no rows affected" (0)
     */
    public int update(
            Uri uri,
            ContentValues values,
            String selection,
            String[] selectionArgs) {
        return 0;
    }
}

Объявление поставщика в манифесте

Платформа адаптеров синхронизации проверяет, что ваше приложение имеет поставщика контента, проверяя, что ваше приложение объявило поставщика в манифесте приложения. Чтобы объявить заглушку поставщика в манифесте, добавьте <provider> элемент со следующими атрибутами:

android:name="com.example.android.datasync.provider.StubProvider"
Задает полное имя класса, реализующего заглушку поставщика контента.
android:authorities="com.example.android.datasync.provider"
URI авторитетного источника, который идентифицирует заглушку поставщика контента. В качестве значения используйте имя пакета вашего приложения с суффиксом ".provider". Даже если вы объявите заглушку поставщика в системе, никто не будет пытаться получить доступ к самому поставщику.
android:exported="false"
Определяет, могут ли другие приложения получить доступ к поставщику контента. Для вашей заглушки поставщика контента, установите значение в false, так как нет необходимости, чтобы ваш поставщик к был виден для других приложений. Это значение не влияет на взаимодействие между платформой адаптеров синхронизации и поставщиком контента.
android:syncable="true"
Флаг, указывающий, что поставщик поддерживает синхронизацию. Если вы установите этот флаг в true, вам не нужно будет вызывать setIsSyncable() в коде. Данный флаг позволяет платформе выполнить передачу данных используя поставщик контента, но передача данных осуществляется только тогда, когда вы выполняете её явно.

Следующий фрагмент показывает, как добавить <provider> элемент в манифест приложения:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.network.sync.BasicSyncAdapter"
    android:versionCode="1"
    android:versionName="1.0" >
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
    ...
    <provider
        android:name="com.example.android.datasync.provider.StubProvider"
        android:authorities="com.example.android.datasync.provider"
        android:export="false"
        android:syncable="true"/>
    ...
    </application>
</manifest>

Теперь, когда вы реализовали необходимые объекты для платформы синхронизации, можно создать компонент, который инкапсулирует код передачи данных. Этот компонент называется адаптер синхронизация. Следующий урок покажет вам, как добавить этот компонент в ваше приложение.