注:本文翻译自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>

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

【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)的更多相关文章

  1. 《第一行代码》学习笔记28-内容提供器Content Provider(1)

    1.内容提供器:用于在不同的应用程序之间实现数据共享的功能,提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访问 数据的安全性.使用内容提供器是Android实现跨程序共享数据 ...

  2. 《第一行代码》学习笔记30-内容提供器Content Provider(3)

    1."如何在自己的程序中访问其他应用程序的数据",思路->获取到该应用程序的内容URI,再借助ContentResolver进行CRUD操作. 2.要实现跨程序共享数据-&g ...

  3. 《第一行代码》学习笔记29-内容提供器Content Provider(2)

    1.查询操作: if (cursor != null) { while (cusor.moveToNext()) { String column1 = cursor.getString(cursor. ...

  4. Android之 内容提供器(2)——创建自己的内容提供器将数据共享出去

    创建自己的内容提供器非常简单,只需要新建一个类继承ContentProvider类,通过实现ContentProvider的增删改查的方法向内容提供器中增删数据. 1 ContentProvider简 ...

  5. android: 创建自己的内容提供器

    我们学习了如何在自己的程序中访问其他应用程序的数据.总体来说思 路还是非常简单的,只需要获取到该应用程序的内容 URI,然后借助 ContentResolver 进行CRUD 操作就可以了.可是你有没 ...

  6. Android学习笔记(十九)——内容提供器

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...

  7. 【Android Developers Training】 92. 序言:使用同步适配器传输数据

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

  8. 【Android Developers Training】 96. 运行一个同步适配器

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

  9. android第一行代码-9.内容提供器

    内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能, 内容提供器包括两部分:使用现有的内容提供器来读取和操作相应程序中的数据跟创建自己的内容提供器给我们程序的 ...

随机推荐

  1. nodeJS中的包

    前面的话 Node组织了自身的核心模块,也使得第三方文件模块可以有序地编写和使用.但是在第三方模块中,模块与模块之间仍然是散列在各地的,相互之间不能直接引用.而在模块之外,包和NPM则是将模块联系起来 ...

  2. Java高效计数器

    本文转载地址:              http://blog.csdn.net/renfufei/article/details/14120775 我们经常使用 HashMap作为计数器(coun ...

  3. VUE依赖webpack分别给开发环境和生产环境配置不同的常量值并在项目中动态引用

    当在开发和产品上线的时候,我们经常会遇到在同一个地方由于环境的不同而地址也不同的情况,这时候如果在代码中将该地址写死,那势必会造成上线时手动改动,多人开发及多处使用该地址难以维护等一系列问题,为避免这 ...

  4. maven如何修改本地仓库与中央仓库

    摘要: 运行Maven的时候,Maven所需要的任何构件都是直接从本地仓库获取的.如果本地仓库没有,它会首先尝试从远程仓库下载构件至本地仓库,然后再使用本地仓库的构件. 什么是Maven仓库 在不用M ...

  5. linux tcp中time_wait

    http://www.cnblogs.com/my_life/articles/3460873.html http://blog.csdn.net/sunnydogzhou/article/detai ...

  6. Java之线程同步练习

    1.有一张银行卡:*属性:name,money(账户余额)* 多线程操作同一张银行卡: 金额:x(每次存钱取钱的数额,取钱时x为负数,存钱时x为整数) 定义一个add方法:用于存取钱,参数为x,即每次 ...

  7. 【2017-06-06】Ajax完整结构、三级联动的制作

    一.Ajax完整结构 $.ajax({ url:"Main.ashx", data:{}, dataType:"json", type:"post&q ...

  8. 一个web应用的诞生(13)--冲向云端

    有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所 ...

  9. Gradle入门学习---认识buildeTypes和dependencies

    Gradle是Android Studio默认的构建工具,如果是基本的APP开发,不会涉及到Gradle太多内容,毕竟它的诞生就不是专为Android服务的. 日常开发需要涉及到使用Gradle的场景 ...

  10. JavaScript设计模式_02_策略模式

    在程序设计中,我们常常遇到这种情况,要实现某一个功能我们有很多种算法可以实现.这些算法灵活多样,而且可以随意互相替换.这种解决方案就是所谓的策略模式. /* * pre:策略模式 * 示例:公司计算奖 ...