Créer un fournisseur de contenu bouchon

Le framework d'adaptateur de synchronisation est conçu pour fonctionner avec les données d'appareil gérées par le framework du fournisseur de contenu, flexible et hautement sécurisé. Pour cette raison, le framework d'adaptateur de synchronisation s'attend à ce qu'une application qui l'utilise ait déjà défini un fournisseur de contenu pour ses données locales. Si le framework de l'adaptateur de synchronisation tente d'exécuter l'adaptateur et que votre application ne dispose pas de fournisseur de contenu, celui-ci plante.

Si vous développez une nouvelle application qui transfère des données d'un serveur à l'appareil, nous vous recommandons vivement de stocker les données locales chez un fournisseur de contenu. En plus de leur importance pour les adaptateurs de synchronisation, les fournisseurs de contenu offrent de nombreux avantages en termes de sécurité et sont spécialement conçus pour gérer le stockage de données sur les systèmes Android. Pour en savoir plus sur la création d'un fournisseur de contenu, consultez la section Créer un fournisseur de contenu.

Toutefois, si vous stockez déjà des données locales sous une autre forme, vous pouvez toujours utiliser un adaptateur de synchronisation pour gérer le transfert de données. Pour satisfaire aux exigences du framework d'adaptateur de synchronisation d'un fournisseur de contenu, ajoutez un fournisseur de contenu bouchon à votre application. Un fournisseur bouchon implémente la classe de fournisseur de contenu, mais toutes ses méthodes requises renvoient null ou 0. Si vous ajoutez un fournisseur bouchon, vous pouvez ensuite utiliser un adaptateur de synchronisation pour transférer les données à partir de n'importe quel mécanisme de stockage de votre choix.

Si vous avez déjà un fournisseur de contenu dans votre application, vous n'avez pas besoin d'un fournisseur de contenu bouchon. Dans ce cas, vous pouvez ignorer cette leçon et passer à la leçon Créer un adaptateur de synchronisation. Si vous n'avez pas encore de fournisseur de contenu, cette leçon vous explique comment ajouter un fournisseur de contenu bouchon qui vous permet de brancher votre adaptateur de synchronisation au framework.

Ajouter un fournisseur de contenu bouchon

Pour créer un fournisseur de contenu bouchon pour votre application, étendez la classe ContentProvider et bouchon ses méthodes requises. L'extrait de code suivant vous montre comment créer le fournisseur bouchon:

Kotlin

/*
 * 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
}

Java

/*
 * 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;
    }
}

Déclarer le fournisseur dans le fichier manifeste

Le framework d'adaptateur de synchronisation vérifie que votre application dispose d'un fournisseur de contenu en vérifiant que votre application a déclaré un fournisseur dans son fichier manifeste. Pour déclarer le fournisseur bouchon dans le fichier manifeste, ajoutez un élément <provider> avec les attributs suivants:

android:name="com.example.android.datasync.provider.StubProvider"
Spécifie le nom complet de la classe qui implémente le fournisseur de contenu bouchon.
android:authorities="com.example.android.datasync.provider"
Autorité d'URI qui identifie le fournisseur de contenu bouchon. Transformez cette valeur en nom de package de votre application, suivi de la chaîne ".provider". Même si vous déclarez votre fournisseur de bouchon au système, rien ne tente d'accéder au fournisseur lui-même.
android:exported="false"
Détermine si d'autres applications peuvent accéder au fournisseur de contenu. Pour votre fournisseur de contenu bouchon, définissez la valeur sur false, car il n'est pas nécessaire d'autoriser les autres applications à voir le fournisseur. Cette valeur n'affecte pas l'interaction entre le framework d'adaptateur de synchronisation et le fournisseur de contenu.
android:syncable="true"
Définit un indicateur indiquant que le fournisseur peut être synchronisé. Si vous définissez cet indicateur sur true, vous n'avez pas besoin d'appeler setIsSyncable() dans votre code. L'indicateur permet au framework de l'adaptateur de synchronisation d'effectuer des transferts de données avec le fournisseur de contenu, mais les transferts ne se produisent que si vous les effectuez explicitement.

L'extrait de code suivant vous montre comment ajouter l'élément <provider> au fichier manifeste de l'application:

<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>

Maintenant que vous avez créé les dépendances requises par le framework de l'adaptateur de synchronisation, vous pouvez créer le composant qui encapsule votre code de transfert de données. Ce composant est appelé "adaptateur de synchronisation". La leçon suivante vous explique comment ajouter ce composant à votre application.