Android:ContentProvider

来源:互联网 发布:乐乎公寓公益西桥 编辑:程序博客网 时间:2024/05/29 16:29

参考博客:http://blog.csdn.net/luoshengyang/article/details/6950440
ContentProvider两个重要的作用:
1、访问数据的统一接口
2、让数据在不同的应用程序之间共享
(即可以将ContentProvider简单理解成应用程序将自己要共享的数据放到ContentProvider中,其它应用程序可以通过ContentProvider访问里面的共享数据)

ContentProvider的相关背景
1、Android中对应用程序中资源的管理是参考Linux的文件管理的,即文件的所有者、所有者所在的用户组、其它组都定义了对该文件的访问权限
2、ContentProvider的应用有:我们开发的app想使用通讯录中的联系人 + 新浪开放平台、QQ开放平台提供数据给第三方使用

ContentProvider如何实现应用程序之间的数据共享和数据访问的统一接口:
1、ContentProvider的实现架构图:
这里写图片描述
(APP通过应用程序中ContentProvider的唯一Uri访问应用程序的共享数据,通过腹泻ContentProvider提供的方法(增、删、改、查)操作数据)
2、ContentProvider如何实现应用程序之间的数据共享和数据访问的统一接口
总之是:Binder进程间通信机制和匿名共享内存机制结合
3、应用程序访问ContentProvider中的共享数据遇到的两个问题:一方面是这些APP没有权限读取这些数据文件,另一外面是Content Provider和这些APP是在不同的进程空间里面。
4、如何解决的呢:虽然一个应用程序不能直接读取另一个应用程序的数据,但是它却可以通过Builder进程间通信方式来请求另一个这个应用程序给它传输数据。并且数据共享的方式并不是通过Builder进程之间简单的传递消息,因为ContentProvider要传递的消息可能会会很有,这里采用的方式是将共享的数据放到Android系统匿名共享内存里面,然后才通过Builder进程通信机制从里面获取数据。

ContentProvider的实现:以ContentProvider的形式提供访问入口 + 通过ContentProvider访问共享的数据
1、URI:一个ContentProvider都有唯一的一个URI标识,其它应用程序就是通过这个URI来访问ContentProvider提供的特定共享数据。一个URI就唯一的标识了一个资源的MIME类型提供的特定数据
这里写图片描述
即[模式] + [标识ContentProvider的唯一标识:包名 + 类名] + [ContentProvider提供的资源类型(ContentProvider可以提供多种资源)] + [所提供资源的特定数据(例如表中的哪一行数据)]

2、URIMatcher:
ContentProvider提供的三种共享数据类型:
content://shy.luo.providers.articles/item表示访问所有的文章信息条目;content://shy.luo.providers.articles/item/123表示只访问ID值为123的文章信息条目;content://shy.luo.providers.articles/pos/1表示访问数据库表中的第1条文章信息条目
分别为这三种数据类型定义相应的URI匹配器;不同的uri对应的query、insert、delete、update都不一样。

3、insert、delete以及update这些操作都会引起数据库表的更新, 所以这时候要通过调用ContentResolver接口的notifyChange函数来通知数据源发生了改变。
4、AndroidMainFest配置:authorities的配置,第三方应用程序就是通过这个authorities属性来找到ContentProvider提供的数据的
5、通过ContentResolver接口调用ContentProvider中方的query、delete、insert、update方法

ContentProvider的基本概念

ContentProvider的基本概念

  1. ContentProvider为数据存储和获取数据提供了统一的接口。
    这样理解:Android中数据存储的方式有很多,譬如说文件啊、SQLite啊。ContentProvider将自己存储的数据进行了封装,用户要访问数据的时候直接调用接口即可访问,而不用关心存储的细节,譬如说手机中联系人的数据。
  2. 使用ContentProvider实现不同应用程序之间的数据共享。
    即默认情况下一个应用程序只能访问自己的数据,而使用ContentProvider即可向其它应用程序暴露自己的数据,实现不同应用程序之间的数据共享。
  3. Android为常见的数据提供了默认的ContentProvider(例如音频啊、视频啊、图片啊和通讯录啊)
    即直接调用ContentProvider就能访问这些数据了。
  4. ContentProvider的数据存储模型:就是一张表
    即Android中所有的数据都有其对应的ContentProvider,而每一种数据的ContentProvider本质就是一张表。那么问题来了,怎么找到特定数据对应的ContentProvider呢?即Uri。

Uri

  1. 每一个ContentProvider都有自己唯一的一个Uri(是一个常亮),这个Uri即表示ContentProvider所提供的数据
  2. android.provider包

ContentProvider的实现方法

ContentProvider所提供的函数:

query() + insert() + update() + delete() + getType(得到数据类型) + onCreate()
  1. ContentProvider的实现步骤(开发过程中,自己实现ContentProvider是不常见,只是这里实现以下好让我们更了解ContentProvider的实现方式,能更好的使用内置的ContentProvider),步骤为:
    1、定义一个CONTENT_URI常量
    例如:uri的定义:
1、//(如果一个ContentProvider中包含了多个子表,则对这些子表都要定义uricontent://com.dengqi.ContentProviderProject.ContentProviderText(类名)/subTable1)2、访问该ContentProvider所返回的数据类型定义(整张表的数据类型)vnd.android.curosr.dir/vnd.firstprovider.user3、访问该ContentProvider所返回的数据类型定义(表中某一个item的数据类型定义)vnd.android.curosr.item/vnd.firstprovider.user

2、定义一个类,继承ContentProvider
3、实现query() + insert() + update() + delete() + getType(根据uri返回该uri所表示的数据类型,即2/3) + onCreate()方法,这些方法即为对数据库的操作

例如:插入// ContentValue为键值对,键为表字段名称、值为属性;返回值为代表插入列的uri对象public Uri insert(Uri uri, ContentValues values)插入的调用://ContentValues values = new ContentValues();values.put(列名, 值)Uri uri = getContentResolver().insert(整张表对应的数据类型对应的uri, values )

4、在AndroidMainfest中声明
(authorities:为类名的全称)

0 0
原创粉丝点击