Utwórz dostawcę wycinków treści

Platforma adaptera synchronizacji została zaprojektowana do pracy z danymi urządzenia zarządzanymi za pomocą elastycznej i niezwykle bezpiecznej platformy dostawców treści. Z tego powodu platforma adaptera synchronizacji oczekuje, że aplikacja, która z niej korzysta, 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 przesyła dane z serwera na urządzenie, zdecydowanie zalecamy zachowanie danych lokalnych u dostawcy treści. Poza tym, jak ważne są adaptery synchronizacji, dostawcy treści oferują też wiele innych korzyści w zakresie bezpieczeństwa i zostały zaprojektowane specjalnie z myślą o przechowywaniu danych w systemach Android. Więcej informacji o tworzeniu dostawcy treści znajdziesz w artykule Tworzenie dostawcy treści.

Jeśli jednak przechowujesz już dane lokalne w innej formie, i tak możesz użyć adaptera synchronizacji do obsługi przesyłania danych. Aby spełnić wymagania dotyczące platformy adaptera synchronizacji w przypadku dostawcy treści, dodaj do swojej aplikacji dostawcę treści skróconych. Dostawca wycinka implementuje klasę dostawcy treści, ale wszystkie wymagane metody zwracają wartość null lub 0. Jeśli dodasz dostawcę wycinka kodu, możesz użyć adaptera synchronizacji do przeniesienia danych z dowolnego wybranego mechanizmu pamięci masowej.

Jeśli w swojej aplikacji masz już dostawcę treści, nie potrzebujesz dostawcy wycinka treści. W takim przypadku możesz pominąć tę lekcję i przejść do lekcji Tworzenie adaptera synchronizacji. Jeśli nie masz jeszcze dostawcy treści, z tej lekcji dowiesz się, jak dodać wycinek z dostawcą treści, który umożliwi podłączenie adaptera synchronizacji do platformy.

Dodaj dostawcę treści wycinkowych

Aby utworzyć dostawcę treści wycinka kodu dla swojej aplikacji, rozszerz klasę ContentProvider i wycofaj wymagane metody. Z tego fragmentu dowiesz się, jak utworzyć dostawcę wycinka kodu:

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 sprawdza, czy Twoja aplikacja ma dostawcę treści, sprawdzając, czy aplikacja ma w manifeście zadeklarowaną dostawcę. Aby zadeklarować dostawcę wycinka w pliku manifestu, dodaj element <provider> z tymi atrybutami:

android:name="com.example.android.datasync.provider.StubProvider"
Określa pełną nazwę klasy implementującej dostawcę treści wycinka kodu.
android:authorities="com.example.android.datasync.provider"
Urząd certyfikacji URI, który identyfikuje dostawcę treści wycinka kodu. Ustaw tę wartość jako nazwę pakietu swojej aplikacji z dołączonym ciągiem znaków „.provider”. Mimo że deklarujesz w systemie dostawcę kodu źródłowego, nic nie próbuje uzyskać do niego dostępu.
android:exported="false"
Określa, czy inne aplikacje mają dostęp do dostawcy treści. W przypadku dostawcy wycinka kodu ustaw wartość na false – nie ma potrzeby, aby inne aplikacje widziały dostawcę. Ta wartość nie ma wpływu na interakcję między platformą adaptera synchronizacji a dostawcą treści.
android:syncable="true"
Ustawia flagę wskazującą, że dostawcy można zsynchronizować. Jeśli ustawisz tę flagę na true, nie musisz wywoływać w kodzie setIsSyncable(). Flaga umożliwia platformie adaptera synchronizacji przesyłanie danych do dostawcy treści, ale dzieje się to tylko wtedy, gdy zrobisz to jawnie.

Ten fragment kodu pokazuje, jak dodać element <provider> do pliku manifestu 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 utworzyć komponent składający się z kodu transferu danych. Ten komponent jest nazywany adapterem synchronizacji. Z następnej lekcji dowiesz się, jak dodać ten komponent do aplikacji.