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

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

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

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

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

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

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

Котлин

/*
 * Define an implementation of ContentProvider that stubs out
 * all methods
 */
class StubProvider : ContentProvider() {
    /*
     * Always return true, indicating that the
     * provider loaded correctly.
     */
    override fun onCreate(): Boolean  = true

    /*
     * Return no type for MIME type
     */
    override fun getType(uri: Uri): String?  = null

    /*
     * query() always returns no results
     *
     */
    override fun query(
            uri: Uri,
            projection: Array<String>,
            selection: String,
            selectionArgs: Array<String>,
            sortOrder: String
    ): Cursor?  = null

    /*
     * insert() always returns null (no URI)
     */
    override fun insert(uri: Uri, values: ContentValues): Uri? = null

    /*
     * delete() always returns "no rows affected" (0)
     */
    override fun delete(uri: Uri, selection: String, selectionArgs: Array<String>): Int = 0

    /*
     * update() always returns "no rows affected" (0)
     */
    override fun update(
            uri: Uri,
            values: ContentValues,
            selection: String,
            selectionArgs: Array<String>
    ): Int = 0
}

Ява

/*
 * 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 no type for MIME type
     */
    @Override
    public String getType(Uri uri) {
        return null;
    }
    /*
     * 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:exported="false"
        android:syncable="true"/>
    ...
    </application>
</manifest>

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