您的位置:首页 > 移动开发 > Android开发

Android:ContentProvider

2015-09-08 11:07 489 查看
参考博客:/article/1363533.html

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的基本概念

ContentProvider为数据存储和获取数据提供了统一的接口。

这样理解:Android中数据存储的方式有很多,譬如说文件啊、SQLite啊。ContentProvider将自己存储的数据进行了封装,用户要访问数据的时候直接调用接口即可访问,而不用关心存储的细节,譬如说手机中联系人的数据。

使用ContentProvider实现不同应用程序之间的数据共享。

即默认情况下一个应用程序只能访问自己的数据,而使用ContentProvider即可向其它应用程序暴露自己的数据,实现不同应用程序之间的数据共享。

Android为常见的数据提供了默认的ContentProvider(例如音频啊、视频啊、图片啊和通讯录啊)

即直接调用ContentProvider就能访问这些数据了。

ContentProvider的数据存储模型:就是一张表

即Android中所有的数据都有其对应的ContentProvider,而每一种数据的ContentProvider本质就是一张表。那么问题来了,怎么找到特定数据对应的ContentProvider呢?即Uri。

Uri

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

android.provider包

ContentProvider的实现方法

ContentProvider所提供的函数:

query() + insert() + update() + delete() + getType(得到数据类型) + onCreate()


ContentProvider的实现步骤(开发过程中,自己实现ContentProvider是不常见,只是这里实现以下好让我们更了解ContentProvider的实现方式,能更好的使用内置的ContentProvider),步骤为:

1、定义一个CONTENT_URI常量

例如:uri的定义:

1、//(如果一个ContentProvider中包含了多个子表,则对这些子表都要定义uricontent://com.dengqi.ContentProviderProject.ContentProviderText(类名)/subTable1)

2、访问该ContentProvider所返回的数据类型定义(整张表的数据类型)
vnd.android.curosr.dir/vnd.firstprovider.user

3、访问该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:为类名的全称)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: