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的基本概念
- 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.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:为类名的全称)
- android contentprovider
- android contentprovider
- Android ContentProvider
- android ContentProvider
- Android ContentProvider
- android ContentProvider
- android ContentProvider
- Android ContentProvider
- Android ContentProvider
- android ContentProvider
- Android ContentProvider
- android contentprovider
- android contentProvider
- Android ContentProvider
- Android ContentProvider
- Android ContentProvider
- Android ContentProvider
- android contentprovider
- CPU 占用过高 (查看Java堆)
- C/C++函数返回值为指针时(2016美团模拟笔试)
- CuteFTP试用期后继续免费使用
- AC/DC电源的设计原理
- 解决Adb connection Error:远程主机强迫关闭了一个现有的连接。 Connection attempts: 1 真机没有连接得最后方法
- Android:ContentProvider
- 不吃苦,你要青春干嘛
- 关于使用zepto框架中的tap click穿透事件 webapp开发
- 2.1 从链表中移除重复结点
- 2015-0908-osg学习历程7
- 面向对象基础
- 扩展性与存储限制问题
- swift学习笔记(一)
- Kth Smallest Element in a BST