สร้างผู้ให้บริการเนื้อหา Stub

เฟรมเวิร์กอะแดปเตอร์ซิงค์ได้รับการออกแบบมาให้ทำงานกับข้อมูลอุปกรณ์ที่จัดการโดย เฟรมเวิร์กผู้ให้บริการเนื้อหาที่มีความปลอดภัยสูง ด้วยเหตุนี้ เฟรมเวิร์กอะแดปเตอร์การซิงค์จึงคาดหวังว่า แอปที่ใช้เฟรมเวิร์กนี้ได้กำหนดผู้ให้บริการเนื้อหาสำหรับข้อมูลในเครื่องแล้ว หากเฟรมเวิร์กอะแดปเตอร์การซิงค์พยายามเรียกใช้อะแดปเตอร์การซิงค์ และแอปของคุณไม่มี Content Provider อะแดปเตอร์การซิงค์เกิดขัดข้อง

หากคุณกำลังพัฒนาแอปใหม่ที่จะโอนข้อมูลจากเซิร์ฟเวอร์ไปยังอุปกรณ์ คุณควร ควรพิจารณาจัดเก็บข้อมูลในเครื่องไว้ในผู้ให้บริการเนื้อหา นอกเหนือจากความสำคัญต่อ อะแดปเตอร์การซิงค์ ผู้ให้บริการเนื้อหามีคุณประโยชน์ด้านความปลอดภัยมากมาย และ ที่ออกแบบมาเพื่อจัดการพื้นที่เก็บข้อมูลในระบบ Android ดูข้อมูลเพิ่มเติมเกี่ยวกับการสร้างเนื้อหา โปรดดูการสร้างผู้ให้บริการเนื้อหา

แต่หากคุณจัดเก็บข้อมูลในเครื่องในรูปแบบอื่นอยู่แล้ว คุณจะยังใช้การซิงค์ได้ เพื่อจัดการการโอนข้อมูล เพื่อให้เป็นไปตามข้อกำหนดเฟรมเวิร์กอะแดปเตอร์การซิงค์สำหรับ Content Provider ให้เพิ่มผู้ให้บริการเนื้อหา Stub ลงในแอป ผู้ให้บริการสตับจะนำองค์ประกอบ คลาสผู้ให้บริการเนื้อหา แต่วิธีการที่จำเป็นทั้งหมดจะแสดงผลเป็น null หรือ 0 หากคุณ เพิ่มผู้ให้บริการสตับ คุณก็ใช้อะแดปเตอร์การซิงค์เพื่อโอนข้อมูลจากพื้นที่เก็บข้อมูลใดก็ได้ ที่คุณเลือก

หากมีผู้ให้บริการเนื้อหาในแอปอยู่แล้ว ก็ไม่จำเป็นต้องมีผู้ให้บริการเนื้อหา Stub ในกรณีนี้ คุณสามารถข้ามบทเรียนนี้และไปยังบทเรียนนั้นต่อ การสร้างอะแดปเตอร์การซิงค์ หากคุณยังไม่มี Content Provider บทเรียนนี้จะแสดงวิธีเพิ่มผู้ให้บริการเนื้อหา Stub ที่ช่วยให้คุณทำสิ่งต่อไปนี้ได้ เสียบอะแดปเตอร์การซิงค์เข้ากับเฟรมเวิร์ก

เพิ่มผู้ให้บริการเนื้อหา Stub

หากต้องการสร้างผู้ให้บริการเนื้อหา Stub สำหรับแอป โปรดขยายชั้นเรียน 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;
    }
}

ประกาศผู้ให้บริการในไฟล์ Manifest

เฟรมเวิร์กอะแดปเตอร์การซิงค์จะยืนยันว่าแอปของคุณมีผู้ให้บริการเนื้อหาหรือไม่ โดยตรวจสอบว่า แอปได้ประกาศผู้ให้บริการในไฟล์ Manifest ของแอป หากต้องการประกาศผู้ให้บริการสตับใน ไฟล์ Manifest ให้เพิ่มเอลิเมนต์ <provider> ที่มีแอตทริบิวต์ต่อไปนี้

android:name="com.example.android.datasync.provider.StubProvider"
ระบุชื่อที่มีคุณสมบัติครบถ้วนของคลาสที่ใช้ผู้ให้บริการเนื้อหา Stub
android:authorities="com.example.android.datasync.provider"
สิทธิ์ URI ที่ระบุผู้ให้บริการเนื้อหา Stub ทำให้ค่านี้ ชื่อแพ็กเกจที่มีสตริง ".provider" ต่อท้าย แม้ว่าคุณจะประกาศ ระบบไม่ได้ดำเนินการใดๆ กับคำขอเข้าถึงผู้ให้บริการเอง
android:exported="false"
กำหนดว่าแอปอื่นๆ สามารถเข้าถึงผู้ให้บริการเนื้อหาได้หรือไม่ สำหรับเนื้อหาต้นขั้ว ให้กำหนดค่าเป็น false เนื่องจากไม่จำเป็นต้องอนุญาตให้แอปอื่นๆ ดู กับผู้ให้บริการ ค่านี้ไม่ส่งผลต่อการโต้ตอบระหว่างเฟรมเวิร์กอะแดปเตอร์การซิงค์ และผู้ให้บริการเนื้อหา
android:syncable="true"
ตั้งค่าแฟล็กที่ระบุว่าผู้ให้บริการซิงค์ได้ หากตั้งค่าสถานะนี้เป็น true คุณไม่จำเป็นต้องโทรหา setIsSyncable() ด้วยรหัสของคุณ ธงนี้อนุญาตให้เฟรมเวิร์กอะแดปเตอร์การซิงค์สร้างข้อมูล การโอนกับผู้ให้บริการเนื้อหา แต่การโอนจะเกิดขึ้นเฉพาะในกรณีที่ดำเนินการอย่างชัดแจ้งเท่านั้น

ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีเพิ่ม องค์ประกอบ <provider> ไปยังไฟล์ Manifest ของแอป:

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

เมื่อสร้างทรัพยากร Dependency ที่เฟรมเวิร์กอะแดปเตอร์การซิงค์ต้องการแล้ว คุณจะทำสิ่งต่อไปนี้ได้ สร้างคอมโพเนนต์สรุปโค้ดการโอนข้อมูล คอมโพเนนต์นี้เรียกว่า อะแดปเตอร์การซิงค์ บทเรียนถัดไปจะแสดงวิธีเพิ่มคอมโพเนนต์นี้ลงในแอปของคุณ