同步适配器框架旨在处理由 柔性环境 高度安全的内容提供程序框架因此,同步适配器框架需要 使用该框架的应用已为其本地数据定义了 content provider。 如果同步适配器框架尝试运行您的同步适配器,但您的应用 content provider,您的同步适配器将会崩溃。
如果您正在开发将数据从服务器传输到设备的新应用,您应该 强烈建议将本地数据存储在 content provider 中。它们不仅对于 同步适配器、Content Provider 提供各种安全优势, 用于处理 Android 系统上的数据存储。详细了解如何创建内容 provider,请参阅创建 content provider。
不过,如果您已经以其他形式存储本地数据,则仍然可以使用同步功能,
适配器来处理数据传输。为了满足同步适配器框架对
content provider,请向您的应用添加桩 content provider。桩提供器用于实现
content provider 类,但其所有必需的方法都会返回 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"
-
确定其他应用是否可以访问 content provider。桩内容
提供程序时,请将该值设置为
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>
现在您已经创建了同步适配器框架所需的依赖项,接下来可以 创建封装数据传输代码的组件。该组件称为 同步适配器。下一课将介绍如何向应用添加此组件。