android跨进程通讯二:ContentProvider总结

1、ContentProvider简介:

在Android官方指出的Android的数据存储方式总共有五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite。但是我们知道一般这些存储都只是在单独的一个应用程序之中达到一个数据的共享,有时候我们需要操作其他应用程序的一些数据,例如我们需要操作系统里的媒体库、通讯录等,这时我们就可能通过ContentProvider来满足我们的需求了。

2、为什么要选择ContentProvider?

ContentProvider向我们提供了我们在应用程序之前共享数据的一种机制,而我们知道每一个应用程序都是运行在不同的应用程序的,数据和文件在不同应用程序之间达到数据的共享不是没有可能,而是显得比较复杂,而正好Android中的ContentProvider则达到了这一需求,比如有时候我们需要操作手机里的联系人,手机里的多媒体等一些信息,我们都可以用到这个ContentProvider来达到我们所需。

1)、ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。

2)、使用ContentProvider可以在不同的应用程序之间共享数据。 

3)、Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。 
总的来说使用ContentProvider对外共享数据的好处是统一了数据的访问方式。

3、Uri介绍

为系统的每一个资源给其一个名字,比方说通话记录。
1)、每一个ContentProvider都拥有一个公共的URI,这个URI用于表示这个ContentProvider所提供的数据。 
2)、Android所提供的ContentProvider都存放在android.provider包中。 将其分为A,B,C,D 4个部分:


A:标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;"content://"
B:URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称
C:路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;"content://com.bing.provider.myprovider/tablename"
D:如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; "content://com.bing.provider.myprovider/tablename/#" #表示数据id。

PS:

路径(path)可以用来表示我们要操作的数据,路径的构建应根据业务而定,如下:
1、要操作person表中id为10的记录,可以构建这样的路径:/person/10
2、要操作person表中id为10的记录的name字段, person/10/name
3、要操作person表中的所有记录,可以构建这样的路径:/person
4、要操作xxx表中的记录,可以构建这样的路径:/xxx
5、当然要操作的数据不一定来自数据库,也可以是文件、xml或网络等其他存储方式,如下:
要操作xml文件中person节点下的name节点,可以构建这样的路径:/person/name
6、如果要把一个字符串转换成Uri,可以使用Uri类中的parse()方法,如下:Uri uri = Uri.parse("content://com.bing.provider.personprovider/person")

以上三节转载自:http://www.2cto.com/kf/201404/296974.html,非常清晰地介绍了ContentProvider的概念。

4、ContentProvider代码结构介绍

ContentProvider分客户端和服务端,客户端用URI来表示需要操作的表,通过ContentResolver的方法来操作数据库;服务端解析URI,然后使用数据库操作类SQLiteDatabase对数据库进行查询、插入、删除、更新等操作。

5、客户端详细介绍
ContentProvider的客户端可以是Activity等组件,可以直接使用ContentResolver的方法对数据库进行操作。

6、服务端详细介绍
ContentProvider的服务端可以是Activity或service等,要有:
一个extends SQLiteOpenHelper类,用于数据库创建和版本的管理;
一个tablename.java类,用于存储整条表记录;
一个extends ContentProvider类,用于实现提供给客户端的接口,ContentProvider的接口有onCreate、query、getType、insert、delete、update;
最后在AndroidManifest.xml中要注册这个ContentProvider,注册后客户端才能通过URI找到这个ConentProvider执行操作;

7、易错点总结

出现错误:E/AndroidRuntime(  293): java.lang.RuntimeException: Unable to get provider com.
example.remoteservice.provider.SysParamProvider: java.lang.ClassNotFoundExcept
ion: com.example.remoteservice.provider.SysParamProvider in loader dalvik.syst
em.PathClassLoader[/data/app/com.example.remoteservice-1.apk]
原因:SysParamProvider定义于包com.example.sysparam中,而在AndroidManifest.xml中注册provider时,有如下定义package="com.example.remoteservice",而Android系统就是按照这个包来查询对应的Provider类的,因此ContentProvider类的定义要放在AndroidManifest.xml中的package定义的包中。

8、很遗憾,demo源码无法上传,学习一个新的知识点最快的办法就是看一个最简单的demo源码。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值