SyncAdapter without a ContentProvider
Asked Answered
B

2

39

I want to implement a SyncAdapter for a content I want to synchronize with a server. It seems that to do so, you need a ContentProvider registered for the authority you specify in the SyncAdapter XML property file.

As I don't want this content to be accessible to the rest of the phone, I haven't implemented my own ContentProvider and used a personal implementation to store this content.

Do you know if it is possible to provide a synchronization using a SyncAdapter without providing a ContentProvider?

Thank you very much.

Brigadier answered 10/1, 2011 at 17:54 Comment(1)
related (later) question Should I use android AccountManager?Rorrys
Z
57

You always have to specify a content provider when implementing a SyncAdapter, but that's not to say it actually has to do anything.

I've written SyncAdapters that create accounts and integrate with the "Accounts & sync" framework in Android that don't necessarily store their content in a standard provider.

In your 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" />

In your manifest:

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

And then add a dummy provider that doesn't do anything useful except exist, 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;
    }
}
Zelmazelten answered 10/1, 2011 at 19:23 Comment(7)
Thank you very much, I don't really like this idea of using a dummy provider but might have no choice.Brigadier
I looked for a long time for a better solution and found none and share your pain.Zelmazelten
As an aside, the SampleSyncAdapter found in the SDK doesn't declare a content provider since it uses a native Android authority, com.android.contacts , which has its own provider com.android.providers.contacts .Lapel
But how syncadapter is called? what are the coditions for being called?Akkadian
+1 "You always have to specify a content provider when implementing a SyncAdapter"Heroics
@FredericYesidPeñaSánchez there are 2 conditions for syncAdapter to call 1. When user do manual sync 2. At least once in 24 hrs provided device is connected to network.Meprobamate
Google's documentation suggests you do the same thing except they call it a "StubProvider." So, if you're not implementing a ContentProvider provide a "DummyProvider"/"StubProvider." There is no way around it.Glucose
P
6

Now, even the official documentation by Google suggest that you use a stub (dummy) ContentProvider.

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

Pursuivant answered 9/7, 2015 at 8:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.