Creare un fornitore di contenuti stub

Il framework dell'adattatore di sincronizzazione è progettato per funzionare con i dati del dispositivo gestiti mediante il framework del fornitore di contenuti flessibile e altamente sicuro. Per questo motivo, il framework dell'adattatore di sincronizzazione prevede che un'app che utilizza il framework abbia già definito un fornitore di contenuti per i propri dati locali. Se il framework dell'adattatore di sincronizzazione tenta di eseguire l'adattatore di sincronizzazione e l'app non ha un fornitore di contenuti, l'adattatore di sincronizzazione si arresta in modo anomalo.

Se stai sviluppando una nuova app che trasferisce i dati da un server al dispositivo, ti consigliamo vivamente di archiviare i dati locali in un fornitore di contenuti. Oltre a essere importanti per gli adattatori di sincronizzazione, i fornitori di contenuti offrono una serie di vantaggi in termini di sicurezza e sono specificamente progettati per gestire l'archiviazione dei dati sui sistemi Android. Per scoprire di più sulla creazione di un fornitore di contenuti, consulta la sezione Creazione di un fornitore di contenuti.

Tuttavia, se stai già archiviando dati locali in un altro formato, puoi comunque utilizzare un adattatore di sincronizzazione per gestire il trasferimento dei dati. Per soddisfare il requisito del framework dell'adattatore di sincronizzazione per un fornitore di contenuti, aggiungi un fornitore di contenuti stub alla tua app. Un provider stub implementa la classe del fornitore di contenuti, ma tutti i metodi richiesti restituiscono null o 0. Se aggiungi un provider di stub, puoi utilizzare un adattatore di sincronizzazione per trasferire i dati da qualsiasi meccanismo di archiviazione scelto.

Se hai già un fornitore di contenuti nella tua app, non hai bisogno di un fornitore di contenuti stub. In tal caso, puoi saltare questa lezione e passare alla lezione Creazione di un adattatore di sincronizzazione. Se non hai ancora un fornitore di contenuti, questa lezione spiega come aggiungere un fornitore di contenuti stub che ti permetta di collegare l'adattatore di sincronizzazione al framework.

Aggiungi un fornitore di contenuti stub

Per creare un fornitore di contenuti stub per la tua app, estendi la classe ContentProvider ed esponi i metodi richiesti. Il seguente snippet mostra come creare il provider 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;
    }
}

Dichiara il provider nel file manifest

Il framework dell'adattatore di sincronizzazione verifica che la tua app abbia un fornitore di contenuti controllando che l'app abbia dichiarato un provider nel file manifest dell'app. Per dichiarare il provider di stub nel manifest, aggiungi un elemento <provider> con i seguenti attributi:

android:name="com.example.android.datasync.provider.StubProvider"
Specifica il nome completo della classe che implementa il fornitore di contenuti stub.
android:authorities="com.example.android.datasync.provider"
Un'autorità URI che identifica il fornitore di contenuti stub. Imposta questo valore come nome del pacchetto dell'app aggiungendo la stringa ".provider". Anche se dichiari il provider stub nel sistema, nulla tenta di accedere al provider stesso.
android:exported="false"
Consente di stabilire se altre app possono accedere al fornitore di contenuti. Per il fornitore di contenuti stub, imposta il valore su false, poiché non è necessario consentire ad altre app di vedere il provider. Questo valore non influisce sull'interazione tra il framework dell'adattatore di sincronizzazione e il fornitore di contenuti.
android:syncable="true"
Imposta un flag per indicare che il provider è sincronizzabile. Se imposti questo flag su true, non devi chiamare setIsSyncable() nel codice. Il flag consente al framework dell'adattatore di sincronizzazione di effettuare trasferimenti di dati con il fornitore di contenuti, ma i trasferimenti vengono eseguiti solo se li esegui esplicitamente.

Lo snippet seguente mostra come aggiungere l'elemento <provider> al file manifest dell'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>

Ora che hai creato le dipendenze richieste dal framework dell'adattatore di sincronizzazione, puoi creare il componente che incapsula il codice Data Transfer. Questo componente è chiamato adattatore di sincronizzazione. La prossima lezione spiega come aggiungere questo componente alla tua app.