إنشاء موفّر محتوى بديل

تم تصميم إطار عمل محوّل المزامنة للتوافق مع بيانات الجهاز التي تتم إدارتها من خلال إطار عمل موفّر المحتوى المرن والأمان للغاية. لهذا السبب، يتوقع إطار عمل محوِّل المزامنة أن يكون التطبيق الذي يستخدم إطار العمل قد سبق له تحديد موفّر محتوى لبياناته المحلية. إذا حاول إطار عمل محوّل المزامنة تشغيل محوّل المزامنة، ولم يكن هناك موفّر محتوى لتطبيقك، سيتعطّل محوّل المزامنة.

إذا كنت تطوِّر تطبيقًا جديدًا ينقل البيانات من خادم إلى الجهاز، يجب التفكير بشدّة في تخزين البيانات المحلّية في موفّر محتوى. بالإضافة إلى أهميتها بالنسبة إلى محوّلات المزامنة، يقدّم موفّرو المحتوى مجموعة متنوعة من مزايا الأمان ومصمّمة خصيصًا لمعالجة تخزين البيانات على أنظمة Android. لمعرفة المزيد من المعلومات حول كيفية إنشاء موفّر محتوى، يمكنك الاطّلاع على المقالة إنشاء موفّر محتوى.

إذا كنت تخزِّن بيانات محلية في نموذج آخر، لا يزال بإمكانك استخدام محوِّل مزامنة للتعامل مع عملية نقل البيانات. لاستيفاء متطلبات إطار عمل محوّل المزامنة لموفّر المحتوى، أضِف إلى تطبيقك موفّر محتوى رموز كول. ينفّذ موفّر البيانات فئات موفر المحتوى، ولكن جميع طرقه المطلوبة تعرض null أو 0. إذا أضفت موفّر بيانات كعب، يمكنك استخدام محوِّل مزامنة لنقل البيانات من أي آلية تخزين تختارها.

إذا كان لديك موفّر محتوى في تطبيقك، لست بحاجة إلى موفّر محتوى غير مجاني. في هذه الحالة، يمكنك تخطي هذا الدرس والانتقال إلى الدرس إنشاء محوّل مزامنة. إذا لم يكن لديك موفّر محتوى حتى الآن، يوضّح لك هذا الدرس كيفية إضافة موفّر محتوى يتيح لك توصيل محوّل المزامنة في إطار العمل.

إضافة موفّر محتوى التنويهات الموجزة

لإنشاء موفّر محتوى بديل لتطبيقك، عليك توسيع الفئة ContentProvider واكتشاف طرقها المطلوبة. يوضّح لك المقتطف التالي كيفية إنشاء موفّر التنويع الأساسي:

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

تحديد موفِّر الخدمة في البيان

يتحقّق إطار عمل محوِّل المزامنة من أنّ تطبيقك يتضمّن موفّر محتوى من خلال التأكّد من أنّ تطبيقك قد أعلن عن مزوّد الخدمة في بيان التطبيق. لتعريف موفّر بيانات التردّد في البيان، أضِف عنصر <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>

الآن بعد أن أنشأت الاعتماديات التي يتطلبها إطار عمل محوّل المزامنة، يمكنك إنشاء المكوِّن الذي يضم رمز نقل البيانات. ويُسمى هذا المكوِّن محوِّل المزامنة. يوضح لك الدرس التالي كيفية إضافة هذا المكون إلى تطبيقك.