Membuat penyedia konten stub

Framework adaptor sinkronisasi didesain untuk bekerja dengan data perangkat yang dikelola oleh framework penyedia konten yang sangat aman dan fleksibel. Karena alasan ini, framework adaptor sinkronisasi ingin agar aplikasi yang menggunakan framework tersebut sudah menentukan penyedia konten untuk data lokalnya. Jika framework adaptor sinkronisasi mencoba menjalankan adaptor sinkronisasi, sedangkan aplikasi Anda tidak memiliki penyedia konten, adaptor sinkronisasi tersebut akan error.

Jika Anda mengembangkan aplikasi baru yang mentransfer data dari server ke perangkat, Anda harus benar-benar mempertimbangkan untuk menyimpan data lokal di penyedia konten. Selain nilai pentingnya bagi adaptor sinkronisasi, penyedia konten menawarkan berbagai manfaat keamanan dan didesain khusus untuk menangani penyimpanan data di sistem Android. Untuk mempelajari lebih lanjut tentang cara membuat penyedia konten, lihat Membuat Penyedia Konten.

Namun, jika sudah menyimpan data lokal dalam bentuk lain, Anda tetap dapat menggunakan adaptor sinkronisasi untuk menangani transfer data. Untuk memenuhi persyaratan framework adaptor sinkronisasi bagi penyedia konten, tambahkan penyedia konten stub ke aplikasi Anda. Penyedia stub menerapkan class penyedia konten, tetapi semua metode yang diperlukan akan mengembalikan null atau 0. Jika penyedia stub ditambahkan, Anda dapat menggunakan adaptor sinkronisasi untuk mentransfer data dari mekanisme penyimpanan mana pun yang dipilih.

Jika sudah memiliki penyedia konten di aplikasi, Anda tidak memerlukan penyedia konten stub. Dan, Anda dapat melewati tutorial ini dan melanjutkan ke tutorial Membuat Adaptor Sinkronisasi. Jika belum memiliki penyedia konten, tutorial ini akan menunjukkan cara menambahkan penyedia konten stub yang memungkinkan Anda menyambungkan adaptor sinkronisasi ke dalam framework.

Menambahkan penyedia konten stub

Untuk membuat penyedia konten stub bagi aplikasi Anda, perluas class ContentProvider dan hentikan (stub out) metode yang diperlukan tersebut. Cuplikan berikut menunjukkan cara membuat penyedia stub:

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

Mendeklarasikan penyedia di manifes

Framework adaptor sinkronisasi memastikan bahwa aplikasi memiliki penyedia konten dengan memeriksa bahwa aplikasi Anda telah mendeklarasikan penyedia dalam manifes aplikasinya. Untuk mendeklarasikan penyedia stub dalam manifes, tambahkan elemen <provider> dengan atribut berikut:

android:name="com.example.android.datasync.provider.StubProvider"
Menentukan nama class yang memenuhi syarat lengkap yang menerapkan penyedia konten stub.
android:authorities="com.example.android.datasync.provider"
Otoritas URI yang mengidentifikasi penyedia konten stub. Jadikan nilai ini sebagai nama paket aplikasi Anda dengan menambahkan string “.provider” ke dalamnya. Meskipun Anda mendeklarasikan penyedia stub ke sistem, tidak ada yang akan mencoba mengakses penyedia itu sendiri.
android:exported="false"
Menentukan apakah aplikasi lain dapat mengakses penyedia konten. Untuk penyedia konten stub Anda, tetapkan nilai ke false, karena tidak perlu mengizinkan aplikasi lain untuk melihat penyedia. Nilai ini tidak memengaruhi interaksi antara framework adaptor sinkronisasi dengan penyedia konten.
android:syncable="true"
Menetapkan tanda yang menunjukkan bahwa penyedia dapat disinkronkan. Jika tanda ini ditetapkan ke true, Anda tidak perlu memanggil setIsSyncable() dalam kode Anda. Tanda tersebut memungkinkan framework adaptor sinkronisasi untuk melakukan transfer data dengan penyedia konten, namun transfer hanya terjadi jika Anda melakukannya secara eksplisit.

Cuplikan berikut menunjukkan cara menambahkan elemen <provider> ke manifes aplikasi:

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

Setelah membuat dependensi yang diperlukan oleh framework adaptor sinkronisasi, Anda dapat membuat komponen yang merangkum kode transfer data. Komponen ini disebut adaptor sinkronisasi. Tutorial berikutnya akan menjelaskan cara menambahkan komponen ini ke aplikasi Anda.