注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。

原文链接:http://developer.android.com/training/sync-adapters/creating-stub-provider.html


同步适配器框架是设计成用来和设备数据一起工作的,这些设备的数据被灵活且高安全的内容提供器所管理。因此,同步适配器框架会期望应用所使用的框架已经为它的本地数据定义了内容提供器。如果同步适配器框架尝试去运行你的同步适配器,而你的应用没有一个内容提供器的话,那么你的同步适配器将会奔溃。

如果你正在开发一个新的应用,它将数据从服务器传输到一台设备上,那么你务必应该考虑用将本地数据存储于内容提供器中。因为它对于同步适配器来说是很重要的,另外内容提供器可以给予许多安全上的好处,并且是专门被设计成在Android设备上处理数据存储的。要学习如何创建一个内容提供器,可以阅读:Creating a Content Provider

然而,如果你已经通过别的形式来存储本地数据,你仍然可以使用同步适配器来处理数据传输。为了满足同步适配器框架对于内容提供器的要求,可以在你的应用中添加一个空的内容提供器。一个空提供器实现了内容提供器类,但是所有的方法都返回null或者0。如果你添加了一个空提供器,你可以使用同步适配器从任何你选择的存储机制来传输数据。

如果你在你的应用中已经有了一个内容提供器,那么你就不需要一个空的内容提供器了。在这种情况下,你可以略过这节课程,直接进入:Creating a Sync Adapter。如果你还没有一个内容提供器,这节课将向你展示如何添加一个空内容提供器,来允许你将你的同步适配器添加到框架中。


一). 添加一个空内容提供器

要为你的应用创建一个空内容提供器,继承ContentProvider并且置空它需要的方法。下面的代码片段展示了你应该如何创建空的提供器:

/*
* 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 an empty String for MIME type
*/
@Override
public String getType() {
return new String();
}
/*
* 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:export="false"
android:syncable="true"/>
...
</application>
</manifest>

现在你已经创建了同步适配器框架所需要的依赖关系,你可以创建封装你的数据传输代码的组件了。该组件就叫做同步适配器。下节课将会展示如何将它添加到你的应用中。

最新文章

  1. Thinkphp 验证码
  2. Css动画形式弹出遮罩层,内容区上下左右居中于不定宽高的容器中
  3. 【IOS】ios中NSUserDefault与android中的SharedPreference用法简单对比
  4. 欧几里德与扩展欧几里德算法 Extended Euclidean algorithm
  5. Struts学习总结-04 上传文件
  6. python django 模板
  7. 小记:Quartz 当 Job 执行时间超过触发间隔时间时所发生的情况
  8. C/C++获取数组的长度
  9. using System.Collections.Generic;
  10. s​e​t​ ​x​a​c​t​_​a​b​o​r​t ​用​法
  11. Web Api帮助页面或用户手册
  12. Serverlet具体解释
  13. 一种解决Code Map与ReSharper冲突导致Visual Studio 2013 Peek Definition失效的办法
  14. web端常见安全漏洞测试结果分析-- appscan
  15. laravel 嵌套的渴求式加载
  16. 哈密顿绕行世界问题(dfs+记录路径)
  17. [国嵌攻略][119][Linux中断处理程序设计]
  18. Andriod studio 打包aar
  19. 【kafka】celery与kafka的联用问题
  20. es中对mapping的理解

热门文章

  1. LogNet4日志框架使用
  2. Http协议访问DataSnap Rest 服务器
  3. Solve error: &#39;class vtkImageActor&#39; has no member named &#39;SetInput&#39;
  4. Effective java笔记5--通用程序设计
  5. 启动程序的同时传参给接收程序(XE8+WIN764)
  6. [jobdu]孩子们的游戏(圆圈中最后剩下的数)
  7. Windows下的.NET+ Memcached安装
  8. linux中的 tar命令的 -C 参数,以及其它一些参数(转)
  9. 在nginx上部署vue项目(history模式);
  10. 《An Introduction to Signal Smoothing》译文
  11. android的activity栈管理
  12. springboot项目利用devtools实现热部署,改动代码自动生效
  13. linux系统下完全卸载Jenkins
  14. Oracle篇 之 查询行及概念
  15. PythonStudy1——Python 值拷贝 浅拷贝 深拷贝
  16. Socket网络编程--epoll小结
  17. Axios的默认配置(碎片知识)API
  18. Python 模块EasyGui详细介绍
  19. iOS工程结构理解
  20. Zookeeper使用实例——分布式共享锁