Membuat penyedia konten stub

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

Jika Anda mengembangkan aplikasi baru yang mentransfer data dari server ke perangkat, Anda harus mempertimbangkan untuk menyimpan data lokal di penyedia konten. Selain pentingnya adaptor sinkronisasi, penyedia konten menawarkan berbagai manfaat keamanan dan dirancang khusus untuk menangani penyimpanan data di sistem Android. Untuk mempelajari lebih lanjut 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 menampilkan 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. Jika demikian, 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 mencolokkan 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 Anda 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 sepenuhnya memenuhi syarat yang mengimplementasikan 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 dan 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. Flag tersebut memungkinkan framework adaptor sinkronisasi untuk melakukan transfer data dengan penyedia konten, tetapi 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.