Tạo trình cung cấp nội dung mã giả lập

Khung bộ điều hợp đồng bộ hoá được thiết kế để hoạt động với dữ liệu thiết bị được quản lý bằng khung nhà cung cấp nội dung linh hoạt và có tính bảo mật cao. Vì lý do này, khung bộ điều hợp đồng bộ hoá dự kiến rằng một ứng dụng sử dụng khung này đã xác định nhà cung cấp nội dung cho dữ liệu cục bộ của ứng dụng đó. Nếu khung bộ điều hợp đồng bộ hoá cố gắng chạy bộ điều hợp đồng bộ hoá nhưng ứng dụng của bạn không có nhà cung cấp nội dung, thì bộ điều hợp đồng bộ hoá sẽ gặp sự cố.

Nếu đang phát triển một ứng dụng mới có chức năng chuyển dữ liệu từ máy chủ sang thiết bị, bạn nên cân nhắc việc lưu trữ dữ liệu cục bộ trong trình cung cấp nội dung. Ngoài tầm quan trọng đối với bộ chuyển đổi đồng bộ hoá, trình cung cấp nội dung còn mang lại nhiều lợi ích bảo mật và được thiết kế riêng để xử lý hoạt động lưu trữ dữ liệu trên hệ thống Android. Để tìm hiểu thêm về cách tạo trình cung cấp nội dung, hãy xem phần Tạo trình cung cấp nội dung.

Tuy nhiên, nếu đã lưu trữ dữ liệu cục bộ ở một dạng khác, bạn vẫn có thể sử dụng bộ điều hợp đồng bộ hoá để xử lý hoạt động chuyển dữ liệu. Để đáp ứng yêu cầu về khung bộ chuyển đổi đồng bộ hoá cho trình cung cấp nội dung, hãy thêm trình cung cấp nội dung mã giả lập vào ứng dụng của bạn. Trình cung cấp mã giả lập sẽ triển khai lớp trình cung cấp nội dung, nhưng tất cả phương thức bắt buộc đều trả về null hoặc 0. Nếu thêm nhà cung cấp mã giả lập, bạn có thể sử dụng bộ điều hợp đồng bộ hoá để chuyển dữ liệu từ bất kỳ cơ chế lưu trữ nào mà bạn chọn.

Nếu đã có trình cung cấp nội dung trong ứng dụng, bạn không cần có trình cung cấp nội dung giả lập. Trong trường hợp đó, bạn có thể bỏ qua bài học này và chuyển sang bài học Tạo bộ điều hợp đồng bộ hoá. Nếu bạn chưa có trình cung cấp nội dung, bài học này sẽ hướng dẫn bạn cách thêm trình cung cấp nội dung giả lập cho phép bạn cắm bộ điều hợp đồng bộ hoá vào khung này.

Thêm trình cung cấp nội dung mã giả lập

Để tạo một trình cung cấp nội dung mã giả lập cho ứng dụng, hãy mở rộng lớp ContentProvider và tạo mã giả lập các phương thức cần thiết. Đoạn mã sau đây cho bạn biết cách tạo trình cung cấp mã giả lập:

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

Khai báo trình cung cấp trong tệp kê khai

Khung bộ điều hợp đồng bộ hoá xác minh rằng ứng dụng của bạn có nhà cung cấp nội dung bằng cách kiểm tra để đảm bảo rằng ứng dụng đã khai báo nhà cung cấp trong tệp kê khai ứng dụng. Để khai báo trình cung cấp mã giả lập trong tệp kê khai, hãy thêm phần tử <provider> có các thuộc tính sau:

android:name="com.example.android.datasync.provider.StubProvider"
Chỉ định tên đủ điều kiện của lớp triển khai trình cung cấp nội dung mã giả lập.
android:authorities="com.example.android.datasync.provider"
Đơn vị quản lý URI xác định trình cung cấp nội dung mã giả lập. Hãy đặt giá trị này làm tên gói của ứng dụng bằng chuỗi ".provider" được thêm vào sau đó. Mặc dù bạn đang khai báo trình cung cấp mã giả lập cho hệ thống, nhưng bạn không cần phải truy cập vào chính trình cung cấp đó.
android:exported="false"
Xác định xem các ứng dụng khác có thể truy cập vào trình cung cấp nội dung hay không. Đối với trình cung cấp nội dung mã giả lập của bạn, hãy đặt giá trị thành false, vì không cần cho phép các ứng dụng khác xem nhà cung cấp này. Giá trị này không ảnh hưởng đến sự tương tác giữa khung bộ điều hợp đồng bộ hoá và trình cung cấp nội dung.
android:syncable="true"
Đặt một cờ cho biết trình cung cấp này có thể đồng bộ hoá. Nếu thiết lập cờ này thành true, bạn không phải gọi setIsSyncable() trong mã. Cờ này cho phép khung bộ điều hợp đồng bộ hoá thực hiện việc chuyển dữ liệu với trình cung cấp nội dung, nhưng hoạt động chuyển chỉ diễn ra nếu bạn thực hiện việc đó một cách rõ ràng.

Đoạn mã sau đây cho bạn biết cách thêm phần tử <provider> vào tệp kê khai ứng dụng:

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

Bây giờ, bạn đã tạo các phần phụ thuộc theo yêu cầu của khung bộ điều hợp đồng bộ hoá, bạn có thể tạo thành phần đóng gói mã chuyển dữ liệu của mình. Thành phần này được gọi là bộ điều hợp đồng bộ hoá. Bài học tiếp theo sẽ hướng dẫn bạn cách thêm thành phần này vào ứng dụng.