Cómo crear un proveedor de contenido de stub

El framework del adaptador de sincronización está diseñado para funcionar con datos de dispositivos administrados por el entorno flexible y de proveedor de contenido altamente seguro. Por este motivo, el framework del adaptador de sincronización espera que una app que usa el framework ya definió un proveedor de contenido para sus datos locales. Si el framework del adaptador de sincronización intenta ejecutar el adaptador de sincronización y tu app no tiene un de contenido, tu adaptador de sincronización falla.

Si estás desarrollando una nueva app que transfiere datos de un servidor al dispositivo, deberías considera seriamente almacenar los datos locales en un proveedor de contenido. Además de su importancia para los proveedores de contenido ofrecen una variedad de beneficios de seguridad y están diseñada para manejar el almacenamiento de datos en sistemas Android. Para obtener más información sobre cómo crear contenido consulta Cómo crear un proveedor de contenido.

Sin embargo, si ya almacenas datos locales de otra forma, puedes usar una sincronización para administrar la transferencia de datos. Para satisfacer el requisito del framework del adaptador de sincronización de una proveedor de contenido, agrega un proveedor de contenido de stub a tu app. Un proveedor de stub implementa las clase de proveedor de contenido, pero todos sus métodos obligatorios muestran null o 0. Si agregar un proveedor de stub, puedes usar un adaptador de sincronización para transferir datos desde cualquier almacenamiento. mecanismo que elijas.

Si ya tienes un proveedor de contenido en la app, no necesitas un proveedor de contenido de stub. En ese caso, puedes omitir esta lección y continuar con ella. Cómo crear un adaptador de sincronización. Si aún no tienes un proveedor de contenido, esta lección te muestra cómo agregar un proveedor de contenido de stub que te permite conecta el adaptador de sincronización al framework.

Cómo agregar un proveedor de contenido de stub

Para crear un proveedor de contenido de stub para tu app, extiende la clase ContentProvider y realiza un stub por sus métodos obligatorios. Lo siguiente En este fragmento, se muestra cómo crear el proveedor de stub:

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

Cómo declarar el proveedor en el manifiesto

El framework del adaptador de sincronización verifica que tu app tenga un proveedor de contenido. Para ello, comprueba que tu La app declaró un proveedor en su manifiesto. Para declarar el proveedor de stub en el agrega un elemento <provider> con los siguientes atributos:

android:name="com.example.android.datasync.provider.StubProvider"
Especifica el nombre completamente calificado de la clase que implementa el proveedor de contenido de stub.
android:authorities="com.example.android.datasync.provider"
Es una autoridad de URI que identifica al proveedor de contenido de stub. Haz que este valor sea el de tu app nombre del paquete con la cadena ".provider" agregado a ella. Aunque declares tu proveedor de stub al sistema, nada intenta acceder al proveedor.
android:exported="false"
Determina si otras apps pueden acceder al proveedor de contenido. Para tu contenido de stub , establece el valor en false, ya que no es necesario permitir que otras apps vean el proveedor. Este valor no afecta la interacción entre el framework del adaptador de sincronización. y el proveedor de contenido.
android:syncable="true"
Establece una marca que indica que el proveedor se puede sincronizar. Si estableces esta marca como true, no tienes que llamar a setIsSyncable() en tu código. La marca permite que el framework del adaptador de sincronización cree datos se transfieren con el proveedor de contenido, pero las transferencias solo ocurren si las realizas de manera explícita.

En el siguiente fragmento, se muestra cómo agregar <provider> al manifiesto de la app:

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

Ahora que creaste las dependencias que requiere el framework del adaptador de sincronización, puedes el componente que encapsula tu código de transferencia de datos. Este componente se denomina adaptador de sincronización. En la siguiente lección, se muestra cómo agregarlo a la app.