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 kodziesetIsSyncable()
. 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.