同步轉換介面架構旨在處理由彈性及 高度安全的內容供應器架構因此,同步處理轉換介面架構會預期 使用該架構的應用程式已針對本機資料定義內容供應器。 如果同步轉換介面架構嘗試執行同步轉接程式,而您的應用程式沒有 內容供應器,您的同步轉換介面當機。
如果您正在開發新的應用程式,以便將資料從伺服器轉移到裝置,建議您 強烈建議將本機資料儲存在內容供應器中。除了對 同步轉換介面、內容供應器提供各式各樣的安全性優勢,尤其 專為處理 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>
現在,您已建立同步轉換介面架構所需的依附元件,您可以 然後建立封裝資料移轉程式碼的元件。這個元件稱為 同步處理轉換介面下一堂課將說明如何將此元件新增至應用程式。