SyncAdapter без ContentProvider

Я хочу реализовать SyncAdapter для контента, который хочу синхронизировать с сервером. Кажется, для этого вам нужен ContentProvider, зарегистрированный для полномочий, которые вы указываете в XML-файле свойств SyncAdapter.

Поскольку я не хочу, чтобы этот контент был доступен для остальной части телефона, я не реализовал свой собственный ContentProvider и использовал личную реализацию для хранения этого контента.

Знаете ли вы, можно ли обеспечить синхронизацию с помощью SyncAdapter без предоставления ContentProvider?

Большое Вам спасибо.


person Moystard    schedule 10.01.2011    source источник
comment
связанный (позже) вопрос Должен ли я использовать Android AccountManager?   -  person rds    schedule 23.12.2011


Ответы (2)


Вы всегда должны указывать поставщика контента при реализации SyncAdapter, но это не значит, что он действительно должен что-то делать.

Я написал SyncAdapters, которые создают учетные записи и интегрируются с инфраструктурой «Учетные записи и синхронизация» в Android, которые не обязательно хранят свой контент в стандартном поставщике.

В вашем 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" />

В вашем манифесте:

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

А затем добавьте фиктивный провайдер, который не делает ничего полезного, кроме как существует, 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;
    }
}
person Jerry Brady    schedule 10.01.2011
comment
Большое спасибо, мне не очень нравится эта идея использования фиктивного провайдера, но, возможно, у меня нет выбора. - person Moystard; 11.01.2011
comment
Я долго искал лучшее решение и не нашел его, и разделяю вашу боль. - person Jerry Brady; 11.01.2011
comment
Кроме того, SampleSyncAdapter, найденный в SDK, не объявляет поставщика контента, поскольку он использует собственный центр сертификации Android, com.android.contacts, у которого есть собственный поставщик com.android.providers.contacts. - person ChaimKut; 31.01.2011
comment
Но как называется синкадаптер? какие коды для звания? - person Frederic Yesid Peña Sánchez; 06.06.2013
comment
+1 При реализации SyncAdapter всегда нужно указывать поставщика контента. - person Zorb; 12.06.2014
comment
@FredericYesidPeñaSánchez существует 2 условия для вызова syncAdapter 1. Когда пользователь выполняет синхронизацию вручную 2. По крайней мере один раз в 24 часа при условии, что устройство подключается к сети. - person Ankit; 21.07.2014
comment
Документация Google предлагает вам сделать то же самое, за исключением того, что они называют это StubProvider. Итак, если вы не реализуете ContentProvider, предоставьте DummyProvider/StubProvider. Нет никакого способа обойти это. - person ONE; 11.06.2017

Теперь даже в официальной документации Google предлагается использовать заглушку (пустышку) ContentProvider.

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

person Randy Sugianto 'Yuku'    schedule 09.07.2015