Android学习笔记——Content Provider(一)
Content Provider是Android系统四大组件之一:
官方的定义是:A Content Provider manages access to a central repository of data.
那么Android系统为什么要提供这样一个组件呢?
个人觉得至少有如下两点:
首先,Android是一个很重视安全性的系统(貌似Android系统的漏洞最多~~~),一个应用的数据对于其他应用来说私有的,除非你把数据存储在SD卡上。但很多时候我们需要在程序之间共享数据,比如我们想获取联系人的信息之类的。这时Content Provider就提供了一个很好的解决方案,将数据的存储、读取细节隐藏,提供一个统一的接口供其它应用访问,并且还可以做到权限控制,在一定程度上保证数据的安全性。
其次就是进程间通信(inter-process communication IPC)的问题,如果让开发者自己来处理这些细节无疑会加大开发的难度。而Content Provider提供了类似于b/s结构的模式,b与c之间是以一种什么方式去实现我们并不关心,就像我们大部分时候不用去关心网络到底是怎么连接的。开发者应该关心的是怎么去实现一个Content Provider或去调用一个Content Provider。
URI(Uniform Resource Identifier)统一资源标识符
URI和URL(Unifrom Resource Locator)很像,但两者并不是同一个东西,不过可以拿来做类推。
对于一个content URI的一般形式是这样子的:
content://user_dictionary/words
其中“content://”称为scheme,类似于http://或ftp://,表示这个URI的类型。
“user_dictionary”就类似于域名,但在这里应该叫做authority(这个怎么翻译呢?)。它是一个用来标识不同content provider的名称。
“words”这里用于表示对哪一个表进行操作。注意,这里这么说是不准确的!
首先content provider的数据源不一定就是关系型数据库,可以是xml,数据文件甚至是网络数据。
其次,就算是SQLite之类的数据库,这一部分也不一定就真的是一个真实存在的表,它可能就是某个视图而已,这里说它是某一个表只是方便理解,切记!
如何创建一个Uri呢?
第一种:可以用Uri.Builder来创建:
Uri.Builder builder = new Uri.Builder();
builder.scheme("content");
builder.authority("user_dictionary");
builder.path("words");
Uri uri = builder.build();
还有一种更简单的方法,就是使用Uri.Parse()方法:
Uri uri = Uri.parse("content://user_dictionary/words");
显然,第二种要简洁得多了。
有些content provider支持直接查询到某一条记录,就是在上面提到Uri的末尾再加上一个id如:
content://user_dictionary/words/2
就表示直接定位到某一个记录上。构建这种Uri有一个简单的方法
Uri uri = Uri.parse("content://user_dictionary/words");
Uri singleUri = ContentUris.withAppendedId(uri, 4);
从content provider中检索数据:
使用一个content provider主要有如下几个步骤:
在AndroidManifest.xml文件中添加相应的权限。
如,想要查看系统的通话记录应该添加
<uses-permission android:name="android.permission.READ_CALL_LOG" />
要注意,content provider读写权限是分开的,读就只能读,写就只能写(不像写外部存储卡那个权限,它其实还含有读的权限)。比如同时还要修改通话记录的话,还应该添加这个权限:
<uses-permission android:name="android.permission.WRITE_CALL_LOG" />
使用ContentResolver的query方法。该方法的签名是这样的:
public final Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
如果比较熟悉SQLite的应该对这些参数相当熟悉。不就是把一个SQL语句分成几个部分嘛。
这个方法将返回一个Cursor,通过这个“游标”我们就可以得到我们想要的数据了。
下面给一个获取通话记录的例子:
public void getData() {
String[] projection = {
Calls.NUMBER,
Calls.DATE,
Calls.DURATION,
Calls.TYPE
};
Cursor cursor = getContentResolver().query(Calls.CONTENT_URI, projection, null, null, null);
while (cursor.moveToNext()) {
for (int i = 0; i < cursor.getColumnCount(); i++) {
System.out.println(cursor.getColumnName(i) + "--->" + cursor.getString(i));
}
System.out.println("~~~~~~~~~~~~~~~~");
}
cursor.close();
}

其他方法其实也都是差不多的,看看文档可以掌握了,如果还觉得比较难懂,建议先学一下SQLite的使用。
Android学习笔记——Content Provider(一)的更多相关文章
- Android学习总结——Content Provider
原文地址:http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html Content Provider内容提供者 : and ...
- 【转】Pro Android学习笔记(七):了解Content Provider(下上)
我们通过一个Content Provider小例子进行详细说明.数据源是一个SQLite数据库,名字为books.db,该数据库只含有一个表格,名字为books.表格中含有name,isbn,auth ...
- 【转】Pro Android学习笔记(五):了解Content Provider(上)
Content Provider是抽象数据封装和数据访问机制,例如SQLite是Android设备带有的数据源,可以封装到一个content provider中.要通过content provider ...
- Android Contacts (android通讯录读取)-content provider
Content Provider 在数据处理中,Android通常使用Content Provider的方式.Content Provider使用Uri实例作为句柄的数据封装的,很方便地访问地进行数据 ...
- udacity android 学习笔记: lesson 4 part b
udacity android 学习笔记: lesson 4 part b 作者:干货店打杂的 /titer1 /Archimedes 出处:https://code.csdn.net/titer1 ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】 Pro Android学习笔记(五五):调试和分析(3):adb命令、模拟器控制台和StrictMode
目录(?)[-] adb命令 模拟器Console StrictMode adb命令 我们在学习SQLite的使用,介绍过部分adb命令的使用,见Pro Android学习笔记(五):了解Conten ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter
目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续 ...
随机推荐
- BZOJ4832[Lydsy1704月赛]抵制克苏恩——期望DP
题目描述 小Q同学现在沉迷炉石传说不能自拔.他发现一张名为克苏恩的牌很不公平.如果你不玩炉石传说,不必担心,小Q 同学会告诉你所有相关的细节.炉石传说是这样的一个游戏,每个玩家拥有一个 30 点血量的 ...
- BZOJ5311 贞鱼(动态规划+wqs二分+决策单调性)
大胆猜想答案随k变化是凸函数,且有决策单调性即可.去粘了份fread快读板子才过. #include<iostream> #include<cstdio> #include&l ...
- IDEA 快捷键修改(长期更新)
最近误操作,导致idea的快捷键没了. 痛定思痛,打算记录一下,以前修改过的key map 搜索一下就好了: 1 代码格式化 -- reformat code:Ctrl+Alt+L(如果按了没反应, ...
- day13 生成器 三元运算 列表解析
本质上来说生成器迭代器都是一种数据类型,如果你直接打印生成器是无法得出值的,会得到一串内存地址,即一个对象想要得到生成器的值必须要用for或者next,list等来获取 生成器生成器就是一个可迭代对象 ...
- day11 高阶函数 函数式编程
高阶函数,满足 接收函数作为参数或者返回有函数 函数可以当做参数传递给另一个函数 def foo(n): print(n) def bar(name): print("my name is ...
- QT 5 安装 vs2017 后,出现找不到 rc.exe 问题
QT 5 安装 vs2017 后,出现找不到 rc.exe 问题 qt 5 cannot run 'rc.exe' 出现这种错误,是因为,rc.exe 未找到,也就是 SKD 路径不对. 找到相应的 ...
- python开启httpserver服务在自动化测试中的一个小运用
httpserver可以在本机启动一个python实现的web服务器,在自动化测试中,可以将生成测试报告的目录开放给项目组同事. 先安装python 自动化测试框架,生成报告的目录D:\Automat ...
- JavaScript的面向对象原理之原型链详解
一.引言 在16年的10月份,在校内双选会找前端实习的时候,hr问了一个问题:JavaScript的面向对象理解吗?我张口就说“JavaScript是基于原型的!”.然后就没什么好说的了,hr可能不知 ...
- python数据类型(二)
跟着慕课网练习的,一些简单的知识点如下
- 关于pascal退出acm/icpc历史
应该是很久之前的事情了,现在我才知道,有些信息滞后了,本还以为这是最近的事情呢.而2019年noip也将取消pascal,一切成为历史, 想想初中/高中阶段整片地区的使用pascal,c/c++/ja ...