Utwórz dostawcę wycinków treści

Struktura adaptera synchronizacji została opracowana z myślą o pracy z danymi urządzenia zarządzanymi przez platformy dla dostawców treści o najwyższym poziomie bezpieczeństwa. Z tego powodu platforma adaptera synchronizacji oczekuje, że aplikacja korzystająca z tej platformy ma już zdefiniowanego dostawcę treści dla swoich danych lokalnych. Jeśli platforma adaptera synchronizacji próbuje uruchomić adapter synchronizacji, a aplikacja nie ma dostawcy treści, adapter synchronizacji ulega awarii.

Jeśli tworzysz nową aplikację, która przenosi dane z serwera na urządzenie, zdecydowanie zalecamy przechowywanie danych lokalnych u dostawcy treści. Poza ich znaczeniem dostawców treści oferują wiele korzyści w zakresie bezpieczeństwa. Są to zaprojektowany z myślą o przechowywaniu danych w systemach Android. Aby dowiedzieć się więcej o tworzeniu treści Więcej informacji znajdziesz w artykule Tworzenie dostawcy treści.

Jeśli jednak już przechowujesz dane lokalne w innym formularzu, możesz nadal używać synchronizacji do obsługi przesyłania danych. Aby spełnić wymóg platformy adaptera synchronizacji dla dostawca treści, dodaj dostawcę treści fragmentu do swojej aplikacji. Dostawca fragmentu implementuje kod pośredni klasy dostawcy treści, ale wszystkie wymagane metody zwracają wartości null lub 0. Jeśli dodaj dostawcę bazowego, następnie możesz użyć adaptera synchronizacji do przeniesienia danych z dowolnego miejsca przechowywania wybranego mechanizmu.

Jeśli w swojej aplikacji masz już dostawcę treści, nie potrzebujesz namiaru. W takim przypadku możesz pominąć lekcję i przejść do niej. Tworzenie adaptera synchronizacji. Jeśli nie masz jeszcze jako dostawcę treści, z tego wykładu dowiesz się, jak dodać dostawcę treści, który umożliwi Podłącz adapter synchronizacji do platformy.

Dodaj dostawcę treści fragmentu

Aby utworzyć dostawcę treści skróconej dla aplikacji, rozszerz zajęcia ContentProvider i skróć wymagane metody. Poniżej pokazuje, jak utworzyć dostawcę namiaru:

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;
    }
}

Zadeklaruj dostawcę w pliku manifestu

Platforma adaptera synchronizacji weryfikuje, czy aplikacja ma dostawcę treści, sprawdzając, czy aplikacja zadeklarowała dostawcę w swoim pliku manifestu. Aby zadeklarować dostawcę namiaru w parametrze w pliku manifestu dodaj element <provider> z tymi atrybutami:

android:name="com.example.android.datasync.provider.StubProvider"
Określa w pełni kwalifikowaną nazwę klasy, która implementuje atrakcję dostawcy treści.
android:authorities="com.example.android.datasync.provider"
Urząd URI identyfikujący dostawcę treści namiaru. Wykorzystaj tę wartość dla swojej aplikacji nazwa pakietu z ciągiem znaków „.provider”, który został do niego dołączony. Mimo że zadeklarujesz do systemu dostawcy, nic nie próbuje uzyskać dostępu do samego dostawcy.
android:exported="false"
Określa, czy inne aplikacje mają dostęp do dostawcy treści. Materiały podstawowe dostawcy, ustaw wartość false, ponieważ nie trzeba zezwalać innym aplikacjom na dostęp z usługodawcą. Ta wartość nie ma wpływu na interakcję między platformą adaptera synchronizacji i dostawcą treści.
android:syncable="true"
Ustawia flagę wskazującą, że dostawcę można synchronizować. Jeśli ustawisz tę flagę na true, nie musisz dzwonić pod numer setIsSyncable() w kodzie. Flaga umożliwia platformie adaptera synchronizacji tworzenie danych przenoszenia danych do dostawcy treści, ale przeniesienie następuje tylko wtedy, gdy Użytkownik wyrazi na to zgodę.

Ten fragment kodu pokazuje, jak dodać <provider> element w manifeście aplikacji:

<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>

Po utworzeniu zależności wymaganych przez platformę adaptera synchronizacji możesz utwórz komponent, który zawiera kod transferu danych. Ten komponent jest nazywany lub adapter synchronizacji. Następna lekcja pokazuje, jak dodać ten komponent do aplikacji.