یک ارائه دهنده محتوای خرد ایجاد کنید

چارچوب آداپتور همگام‌سازی برای کار با داده‌های دستگاه که توسط چارچوب ارائه‌دهنده محتوای انعطاف‌پذیر و بسیار ایمن مدیریت می‌شود، طراحی شده است. به همین دلیل، چارچوب آداپتور همگام‌سازی انتظار دارد که برنامه‌ای که از چارچوب استفاده می‌کند، قبلاً یک ارائه‌دهنده محتوا برای داده‌های محلی خود تعریف کرده باشد. اگر چارچوب آداپتور همگام‌سازی سعی کند آداپتور همگام‌سازی شما را اجرا کند و برنامه شما ارائه‌دهنده محتوا نداشته باشد، آداپتور همگام‌سازی شما خراب می‌شود.

اگر در حال توسعه یک برنامه جدید هستید که داده ها را از یک سرور به دستگاه منتقل می کند، باید قویاً ذخیره داده های محلی را در یک ارائه دهنده محتوا در نظر بگیرید. علاوه بر اهمیت آنها برای آداپتورهای همگام، ارائه دهندگان محتوا مزایای امنیتی مختلفی را ارائه می دهند و به طور خاص برای مدیریت ذخیره سازی داده ها در سیستم های Android طراحی شده اند. برای کسب اطلاعات بیشتر در مورد ایجاد یک ارائه دهنده محتوا، به ایجاد یک ارائه دهنده محتوا مراجعه کنید.

با این حال، اگر قبلاً داده‌های محلی را به شکل دیگری ذخیره می‌کنید، همچنان می‌توانید از یک آداپتور همگام‌سازی برای مدیریت انتقال داده استفاده کنید. برای ارضای نیاز چارچوب آداپتور همگام‌سازی برای ارائه‌دهنده محتوا، یک ارائه‌دهنده محتوای خرد به برنامه خود اضافه کنید. یک ارائه‌دهنده خرد کلاس ارائه‌دهنده محتوا را پیاده‌سازی می‌کند، اما همه روش‌های مورد نیاز آن null یا 0 را برمی‌گردانند. اگر ارائه‌دهنده خرد اضافه کنید، می‌توانید از یک آداپتور همگام‌سازی برای انتقال داده‌ها از هر مکانیزم ذخیره‌سازی که انتخاب می‌کنید استفاده کنید.

اگر قبلاً یک ارائه‌دهنده محتوا در برنامه خود دارید، نیازی به ارائه‌دهنده محتوای خرد ندارید. در این صورت، می توانید این درس را رد کرده و به درس ایجاد یک آداپتور همگام سازی بروید. اگر هنوز ارائه‌دهنده محتوا ندارید، این درس به شما نشان می‌دهد که چگونه یک ارائه‌دهنده محتوای خرد اضافه کنید که به شما امکان می‌دهد آداپتور همگام‌سازی خود را به چارچوب وصل کنید.

یک ارائه دهنده محتوای خرد اضافه کنید

برای ایجاد یک ارائه دهنده محتوای خرد برای برنامه خود، کلاس ContentProvider را گسترش دهید و روش های مورد نیاز آن را حذف کنید. قطعه زیر نحوه ایجاد ارائه دهنده خرد را به شما نشان می دهد:

کاتلین

/*
 * 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
}

جاوا

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

ارائه دهنده را در مانیفست اعلام کنید

چارچوب آداپتور همگام‌سازی تأیید می‌کند که برنامه شما یک ارائه‌دهنده محتوا دارد، با بررسی اینکه آیا برنامه شما ارائه‌دهنده‌ای را در مانیفست برنامه خود اعلام کرده است. برای اعلام ارائه دهنده خرد در مانیفست، یک عنصر <provider> با ویژگی های زیر اضافه کنید:

android:name="com.example.android.datasync.provider.StubProvider"
نام کاملاً واجد شرایط کلاسی را که ارائه‌دهنده محتوای خرد را پیاده‌سازی می‌کند، مشخص می‌کند.
android:authorities="com.example.android.datasync.provider"
یک مرجع URI که ارائه‌دهنده محتوای خرد را شناسایی می‌کند. این مقدار را با نام بسته برنامه خود با رشته ".provider" اضافه کنید. حتی اگر شما ارائه دهنده خرد خود را به سیستم اعلام می کنید، هیچ چیزی سعی نمی کند به خود ارائه دهنده دسترسی پیدا کند.
android:exported="false"
تعیین می کند که آیا برنامه های دیگر می توانند به ارائه دهنده محتوا دسترسی داشته باشند یا خیر. برای ارائه‌دهنده محتوای خرد خود، مقدار را روی false تنظیم کنید، زیرا نیازی به اجازه دادن به برنامه‌های دیگر برای دیدن ارائه‌دهنده وجود ندارد. این مقدار بر تعامل بین چارچوب آداپتور همگام‌سازی و ارائه‌دهنده محتوا تأثیری ندارد.
android:syncable="true"
پرچمی را تنظیم می کند که نشان می دهد ارائه دهنده قابل همگام سازی است. اگر این پرچم را روی true تنظیم کنید، نیازی نیست که setIsSyncable() در کد خود فراخوانی کنید. پرچم به چارچوب آداپتور همگام‌سازی اجازه می‌دهد تا انتقال داده را با ارائه‌دهنده محتوا انجام دهد، اما انتقال‌ها تنها در صورتی اتفاق می‌افتد که آنها را به صراحت انجام دهید.

قطعه زیر به شما نشان می دهد چگونه عنصر <provider> را به مانیفست برنامه اضافه کنید:

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

اکنون که وابستگی‌های مورد نیاز چارچوب آداپتور همگام‌سازی را ایجاد کرده‌اید، می‌توانید مؤلفه‌ای را ایجاد کنید که کد انتقال داده شما را کپسوله می‌کند. این کامپوننت آداپتور همگام سازی نامیده می شود. درس بعدی به شما نشان می دهد که چگونه این مؤلفه را به برنامه خود اضافه کنید.