建立虛設常式內容供應程式

同步轉接介面架構經過特別設計,能夠處理由彈性、高度安全的內容供應器架構管理的裝置資料。因此,同步轉換介面架構預期使用該架構的應用程式已針對本機資料定義內容供應器。如果同步轉換介面架構嘗試執行同步轉換介面,而您的應用程式沒有內容供應器,表示同步轉換介面會異常終止。

如果您正在開發新的應用程式,可將資料從伺服器傳輸至裝置,強烈建議您考慮將本機資料儲存在內容供應器中。除了對同步轉接程式的重要性外,內容供應器還有各種安全性優勢,專為處理 Android 系統的資料儲存空間而設計。如要進一步瞭解如何建立內容供應器,請參閱「建立內容供應器」。

不過,如果您已在其他表單中儲存本機資料,仍可使用同步轉換介面來處理資料移轉。如要滿足內容供應器的同步轉換介面架構規定,請在應用程式中新增虛設常式內容供應器。虛設常式供應商會實作內容供應器類別,但所有必要方法都會傳回 null0。只要新增虛設常式提供者,就能使用同步轉接介面從任何所選儲存機制轉移資料。

如果應用程式已有內容供應器,就不需要有虛設常式內容供應器。在此情況下,您可以略過這個課程,並繼續前往建立同步處理轉接器課程。如果您還沒有內容供應器,本課程將說明如何新增虛設常式內容供應器,以便將同步轉接程式插入架構。

新增虛設常式內容供應器

如要為應用程式建立虛設常式內容供應器,請擴充類別 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>

現在您已建立同步轉換介面架構所需的依附元件,可以建立封裝資料移轉程式碼的元件。這個元件稱為同步轉換介面。下一堂課將說明如何在應用程式中新增這個元件。