38 votes

SyncAdapter sans ContentProvider

Je veux implémenter un SyncAdapter pour un contenu que je veux synchroniser avec un serveur. Il semble que pour ce faire, vous ayez besoin d'un ContentProvider enregistré pour l'autorité que vous spécifiez dans le fichier de propriétés XML du SyncAdapter.

Comme je ne veux pas que ce contenu soit accessible au reste du téléphone, je n'ai pas implémenté mon propre ContentProvider et j'ai utilisé une implémentation personnelle pour stocker ce contenu.

Savez-vous s'il est possible de fournir une synchronisation en utilisant un SyncAdapter sans fournir un ContentProvider ?

Merci beaucoup.

0 votes

Question connexe (ultérieure) Dois-je utiliser Android AccountManager ?

56voto

Jerry Brady Points 1817

Vous devez toujours spécifier un fournisseur de contenu lorsque vous implémentez un SyncAdapter, mais cela ne veut pas dire qu'il doit réellement faire quelque chose.

J'ai écrit des SyncAdapters qui créent des comptes et s'intègrent au framework "Accounts & sync" dans Android qui ne stockent pas nécessairement leur contenu dans un fournisseur standard.

Dans votre xml/syncadapter.xml :

<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android" 
    android:accountType="com.company.app"
    android:contentAuthority="com.company.content"
    android:supportsUploading="false" />

Dans votre manifeste :

<provider android:name="DummyProvider"
    android:authorities="com.company.content"
    android:syncable="true"
    android:label="DummyProvider" />   

Puis ajoutez un fournisseur fictif qui ne fait rien d'utile à part exister, DummyProvider.java :

public class DummyProvider extends ContentProvider {

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
         return 0;
    }

    @Override
    public String getType(Uri uri) {
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        return null;
    }

    @Override
    public boolean onCreate() {
        return false;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                    String[] selectionArgs, String sortOrder) {
        return null;
    }

    @Override
    public int update(Uri uri, ContentValues values, String selection,
                    String[] selectionArgs) {
        return 0;
    }
}

2 votes

Merci beaucoup, je n'aime pas vraiment cette idée d'utiliser un fournisseur fictif mais je n'ai peut-être pas le choix.

3 votes

J'ai longtemps cherché une meilleure solution et n'en ai trouvé aucune, et je partage votre douleur.

7 votes

Pour l'anecdote, le SampleSyncAdapter trouvé dans le SDK ne déclare pas de fournisseur de contenu puisqu'il utilise une autorité Android native, com.Android.contacts , qui possède son propre fournisseur com.Android.providers.contacts .

6voto

yuku Points 15705

Maintenant, même la documentation officielle de Google suggère que vous utilisiez un stub (factice) ContentProvider .

https://developer.Android.com/training/sync-adapters/index.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X