Creare un fornitore di contenuti stub

La struttura dell'adattatore di sincronizzazione è progettata per funzionare con i dati del dispositivo gestiti un framework per fornitori di contenuti altamente sicuro. Per questo motivo, il framework dell'adattatore di sincronizzazione prevede indica che un'app che utilizza il framework ha già definito un fornitore di contenuti per i dati locali. Se il framework dell'adattatore di sincronizzazione tenta di eseguire l'adattatore di sincronizzazione e l'app non dispone di 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, dovresti Prendi in considerazione l'archiviazione dei dati locali in un fornitore di contenuti. Oltre alla loro importanza per adattatori di sincronizzazione, i fornitori di contenuti offrono una serie di vantaggi in termini di sicurezza e sono progettato per gestire l'archiviazione dei dati sui sistemi Android. Per scoprire di più sulla creazione di contenuti consulta la sezione Creazione di un fornitore di contenuti.

Tuttavia, se archivi già i dati locali in un altro formato, puoi comunque utilizzare una per gestire il trasferimento di dati. Per soddisfare il requisito del framework dell'adattatore di sincronizzazione per un fornitore di contenuti, aggiungete un fornitore di contenuti stub alla vostra app. Un provider stub implementa content provider class, ma tutti i metodi obbligatori restituiscono null o 0. Se aggiungere un provider stub, si può quindi usare un adattatore di sincronizzazione per trasferire i dati da qualsiasi spazio meccanismo scelto.

Se nella tua app è già presente un fornitore di contenuti, non ne hai bisogno. In tal caso, puoi saltare questa lezione e passare alla lezione Creazione di un adattatore di sincronizzazione. Se non disponi ancora di un fornitore di contenuti, questa lezione mostra come aggiungere un fornitore di contenuti stub collega l'adattatore di sincronizzazione al framework.

Aggiungi un fornitore di contenuti stub

Per creare un fornitore di contenuti stub per la tua app, estendi il corso ContentProvider e analizzarne i metodi richiesti. Le seguenti 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 fornitore nel file manifest

Il framework degli adattatori di sincronizzazione consente di verificare che l'app abbia un fornitore di contenuti controllando che le tue l'app ha dichiarato un provider nel file manifest dell'app. Per dichiarare il provider 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. Rendi questo valore la tua app nome del pacchetto con la stringa ".provider" aggiunti. Anche se dichiari il tuo stub al sistema, nulla tenta di accedere al provider stesso.
android:exported="false"
Consente di stabilire se altre app possono accedere al fornitore di contenuti. Per i tuoi contenuti Stub provider, imposta il valore su false, poiché non è necessario consentire ad altre app di vedere il fornitore. Questo valore non influisce sull'interazione tra il framework dell'adattatore di sincronizzazione e il fornitore di contenuti.
android:syncable="true"
Imposta un flag che indica che il provider è sincronizzabile. Se imposti il flag su true, non devi chiamare setIsSyncable() con il codice. Il flag consente al framework dell'adattatore di sincronizzazione di rendere dati vengono trasferiti con il fornitore di contenuti, ma i trasferimenti avvengono solo se li esegui esplicitamente.

Il seguente snippet mostra come aggiungere <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 crea il componente che incapsula il codice di trasferimento dei dati. Questo componente è chiamato l'adattatore di sincronizzazione. La prossima lezione ti mostrerà come aggiungere questo componente alla tua app.