赞
踩
参考博客: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的基本概念
Uri
ContentProvider的实现方法
ContentProvider所提供的函数:
query() + insert() + update() + delete() + getType(得到数据类型) + onCreate()
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:为类名的全称)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。