Android Content Provider基础
Android Content Provider基础
Content Providers
Content providers管理对一个结构化的数据集合的访问。它们封装了数据,并且提供了保护数据安全性的机制。
Content providers是连接跨进程数据的标准接口。
当你需要访问一个content provider中的数据时:
你在应用的Context
中,使用ContentResolver对象作为一个客户端(client),来和provider通信。
而provider是实现了ContentProvider
的一个类的实例,它接收来自客户端的请求,执行请求的动作,然后返回结果。
一般情况下如果你不想和其他应用分享数据的话,是不用开发你自己的content provider的,但是,如果你在你的应用中需要自定义搜索建议,或者实现复制粘贴复杂数据或者文件到其他应用中,你还是需要自己实现provider。
Android本身包含了一些content providers,他们管理音频、视频、图像、联系人信息等数据。
你可以从这个包中(android.provider)看到它们。
这些providers可以在一些限制条件下,被任何Android应用访问。
Content Provider Basics
Content provider最初就是想提供给其他应用来访问的,providers和provider clients提供了一个一致、标准的接口来访问数据,同时也处理了跨进程的通信和数据访问的安全问题。
下面讨论几个基础问题。
数据保存形式
Content provider向外部应用提供数据,用一个或多个table的形式,和关系型数据中的表(table)是类似的,一行就代表了一条数据实例,而这行中的每一列代表了这个实例中的一项数据。表中每一列的header是列名。
注意:一个provider是不要求有主键(primary key)的,如果有主键,也不要求非要用_ID这个名字。
但是,如果你想要把provider的数据和一个ListView绑定,必须有一列叫_ID,原因在 Displaying query results部分解释。
访问一个provider
Provider是一个 ContentProvider
类的具体子类的实例。
要访问provider,需要通过一个客户端对象,即一个 ContentResolver
对象。这个对象中含有一些方法,名字和provider中的相同。
ContentResolver中的方法提供了基本的CRUD(create, retrieve, update, and delete)功能。
客户端应用中的ContentResolver
对象和拥有provider的应用中的ContentProvider
对象自动地处理跨进程的通信(inter-process communication)。
Provider也扮演一个抽象层,位置处在repository of data和作为data外部表现的tables之间。
注意:要访问一个provider,你的应用通常需要请求一些特定的权限,这些在Content Provider Permissions部分讨论。
Content URIs
Content URI是一个URI,它用来确定识别(identify)provider中的数据的。
Content URIs包含了provider的标志符号名(authority)和一个指向表的名字(path)。
当你调用一个客户端方法访问provider中的table时,content URI就是其中一个参数。
ContentResolver
对象会解析出URI的authority,通过和系统中已知的providers的表进行对比,决议找出需要的provider。
之后,ContentResolver
对象将会向正确的provider分发(dispatch)查询的参数。
ContentProvider使用URI的path部分来选择要访问的table,通常每一个table都有一个path。
一个完整的URI例子:
content://user_dictionary/words
其中user_dictionary为authority,words为table的path,content:// (the scheme)必须有,它说明这个URI是一个content URI。
有很多的provider允许你在URI中附加ID值来访问table中的某一行,比如:
Uri singleUri = ContentUris.withAppendedId(UserDictionary.Words.CONTENT_URI,4);
注意: Uri
和 Uri.Builder
类包含了很多方法可以从字符串构造URI;ContentUris
提供了方便的方法可以给URI附加id值。
Retrieving Data from the Provider
从provider中取数据,基本的步骤如下:
1.请求向provider获取数据的权限。
2.定义代码,向provider发送查询。
权限的获取不能是运行时请求的,必须在manifest文件中说明你需要这种权限,使用<uses-permission>
元素,然后用provider定义的权限名。
更多关于provider的权限的讨论参见:Content Provider Permissions.
构造查询:查询类似于SQL查询,包含了要返回的一些列(The set of columns that the query should return is called a projection),一个选择标准的集合,以及排序的顺序。
Displaying query results
客户端方法 ContentResolver.query()
总是返回Cursor
,包含了满足选择标准的行中的由projection指定的列(containing the columns specified by the query's projection for the rows that match the query's selection criteria)。
Cursor
提供了对其包含的行和列的随机访问。
使用 Cursor
类的方法,可以迭代访问结果中的行,决定每一列的数据类型,从列中取得数据,检验结果的其他特性等。
一些Cursor类的实现会在provider中的数据改变时自动地更新对象,或者在Cursor改变的时候,触发一些观察者对象的方法,或者二者都有。
注意:一个provider有可能会根据发出查询的对象的本质,限制对列的访问。
比如,Contacts Provider对sync adapters限制了对某些列的访问,所以它不会把这些列发送给一个activity或者service。
如果没有行满足查询条件,provider会返回一个空的Cursor对象,即它的 Cursor.getCount()
是0。
如果查询失败,查询的结果取决于具体的provider,它可以选择返回null,也可能是抛出异常。
由于一个 Cursor
是一个行的列表,一个显示它的内容的不错的方法就是用一个SimpleCursorAdapter把 Cursor
和 ListView
连接起来。
注意,要用ListView显示时,Cursor必须包含一个列叫做_ID。因此,很多providers中,每一个表都有一个_ID列。
和从provider查取数据类似,你也可以使用客户端和provider的交互方式来修改数据。
你调用一个 ContentResolver
的方法,传递参数,接着就被传到 ContentProvider
中的对应方法中去,provider和provider client会自动地处理安全性和跨进程通信问题。
参考资料
Reference:
http://developer.android.com/reference/android/content/ContentProvider.html
API Guides:
http://developer.android.com/guide/topics/providers/content-providers.html
Android Content Provider基础的更多相关文章
- (转载)Android content provider基础与使用
android有一个独特之处就是,数据库只能被它的创建者所使用,其他的应用是不能访问到的,所以如果你想实现不同应用之间的数据共享,就不得不用content provider了.在Android中,co ...
- Android Content Provider Guides
Android Content Provider Guides Content Providers管理对结构化数据集的访问.它们包装数据,并且提供一种定义数据安全的机制. Content provid ...
- Android开发-API指南-Content Provider基础
Content Provider Basics 英文原文:http://developer.android.com/guide/topics/providers/content-provider-ba ...
- Content Provider Basics ——Content Provider基础
A content provider manages access to a central repository of data. A provider is part of an Android ...
- Android Content Provider简介
Content Provider是Android的四大组件之一,与Activity和Service相同,使用之前需要注册: Android系统中存在大量的应用,当不同的应用程序之间需要共享数据时,可以 ...
- Android Content Provider的启动过程源码分析
本文參考Android应用程序组件Content Provider的启动过程源码分析http://blog.csdn.net/luoshengyang/article/details/6963418和 ...
- 6、Android Content Provider测试
如果你的应用中使用了Content Provider来与其他应用进行数据交互,你需要对Content Provider进行测试来确保正常工作. 创建Content Provider整合测试 在Andr ...
- [Android] Content provider, ContentResolver
Content provider的作用: Content providers manage access to a structured set of data. They encapsulate t ...
- [典型漏洞分享]exported Android content provider引发的隐私泄露问题
YS android手机APP对外开放多余的content provider,可任意增.删.改和查images数据库表格,导致隐私泄露 问题描述: YS android手机APP使用SQLITE数据库 ...
随机推荐
- SQL Server中的事务日志管理(7/9):处理日志过度增长
当一切正常时,没有必要特别留意什么是事务日志,它是如何工作的.你只要确保每个数据库都有正确的备份.当出现问题时,事务日志的理解对于采取修正操作是重要的,尤其在需要紧急恢复数据库到指定点时.这系列文章会 ...
- 歌词文件解析(一):LRC格式文件的解析
LRC是英文lyric(歌词)的缩写,被用做歌词文件的扩展名.以lrc为扩展名的歌词文件可以在各类数码播放器中同步显示.LRC 歌词是一种包含着“*:*”形式的“标签(tag)”的基于纯文本的歌词专用 ...
- Auto Mapper03
经过上一篇博客的学习,大体了解了Auto Mapper的运行机制和操作流程.我们下来学习下,AutoMapper里面具体的一些东西. 一:规则 当我们使用AutoMapper创建实体和 ...
- js 比较好的博客
1.0 作者:cloudgamer http://www.cnblogs.com/cloudgamer/archive/2010/04/01/ImageZoom.html
- 【FTP】C# System.Net.FtpClient库连接ftp服务器(上传文件)
如果自己单枪匹马写一个连接ftp服务器代码那是相当恐怖的(socket通信),有一个评价较高的dll库可以供我们使用. 那就是System.Net.FtpClient,链接地址:https://net ...
- 15天玩转redis —— 第四篇 哈希对象类型
redis中的hash也是我们使用中的高频数据结构,它的构造基本上和编程语言中的HashTable,Dictionary大同小异,如果大家往后有什么逻辑需要用 Dictionary存放的话,可以根据场 ...
- XE8 (RTM) Android SDK 更新安装
适用:XE8 Android 平台 问题:安装 XE8 RTM 时,如果勾选了 Android SDK 5.0.1 (API 21) 及 Android NDK (android-ndk-r9c) , ...
- 【书籍下载链接】_1_第一轮_C语言书籍
各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...
- Struts2之Struts2-2.5.5 Interceptor
Struts2-2.5.5版本是目前为止最新的版本了,相对于之前的2.3版本以及再之前的版本而言,新版本改动了很多. 好了,废话不多说,GO CODE! 基本jar包: web.xml核心配置,这里要 ...
- struts 用拦截器进行用户权限隔离,未登录用户跳到登录界面 *** 最爱那水货
一般,我们的web应用都是只有在用户登录之后才允许操作的,也就是说我们不允许非登录认证的用户直接访问某些页面或功能菜单项.对于个别页面来说,可能不需要进行拦截,此时,如果项目采用struts view ...