Android学习笔记(十六) ContentProvider
1、相关概念
- ContentProvider:不同应用程序之间进行数据交换的标准API;程序“暴露”数据的方法。
- ContentResolver:一个程序访问另一个程序被“暴露”的数据的方法。
- Uri:Uri是ContentProvider和ContentResolver进行数据交换的标识。
举例说明:一个CotentResolver想要从一个ContentProvider那里获取数据,必须先要找到这个ContentProvider,找到的方法就是通过Uri这个参数,因为每一个Uri都有一个对应的ContentProvider。然后这个ContentResolver向Uri执行CRUD等操作,这个Uri再将这些CRUD操作委托给ContentProvider执行。
2、开发和配置ContentProvider
开发ContentProvider的具体过程较为复杂。因为开发时大多时候用Android自带的ContentProvider,所以这里仅作大概了解。
开发一个ContentProvider,需要先构造一个继承ContentProvider的子类,然后再在AndroidManifext.xml文件中注册。
2.1 继承ContentProvider
需要重写以下方法:
- public Cursor query(Uri uri, String[] projection, String where, String whereArgs, String sortOrder)
- public Uri insert(Uri uri, ContentValues values)
- public int update(Uri uri, ContentValues values String where, String whereArgs)
- public int delete(Uri uri, String where, String[] whereArgs)
- public boolean onCreate()
- public String getType()
2.2 配置ContentProvider
在<application…/>标签里加入:
- < provider
- android:name=".MyProvider"
- android:authorities="com.providers.myprovider"
- android:exported="true"/>
其中,name指定该ContentProvider的实现类的类名;
authorities指定该ContentProvider对应的Uri(相当于为该ContentProvider分配一个域名);
exported指定该ContentProvider是否允许被其他应用调用。
3、使用ContentResolver调用方法
Context提供了getContentResolver()方法,因此Activity、Service等组件都可以通过getContentResolver()方法获取ContentResolver对象。
- public class MainActivity extends Activity{
- ContentResolver contentResolver;
- Uri uri = Uri.parse("content://com.providers.myprovider/");
- @Override
- public void onCreate(Bundle savedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //获取系统的ContentResolver对象
- ContentResolver = getContentResolver();
- }
- public void query(View source){
- //调用ContentResolver的query()方法
- //实际返回的是该Uri对应的ContentProvider的query()的返回值
- Cursor cursor = contentResolver.query(uri,null,"query_where",null,null);
- Toast.makeText(this,"远程ContentResolver返回的Cursor为:"+cursor,Toast.LENGTH_SHORT).show();
- }
- public void insert(View source){
- ContentValues values = new ContentValues();
- Values.put("name","fkjava");
- //调用ContentResolver的insert()方法
- //实际返回的是该Uri对应的ContentProvider的insert()的返回值
- Uri newUri = contentResolver.insert(uri,values);
- Toast.makeText(this,"远程ContentResolver新插入的记录的Uri为:"+newUri,Toast.LENGTH_SHORT).show();
- }
- public void update(View source){
- ContentValues values = new ContentValues();
- values.put("name","fkjava");
- //调用ContentResolver的update()方法
- //实际返回的是该Uri对应的ContentProvider的update()的返回值
- int count = contentResolver.update(uri, values, "update_where", null);
- Toast.makeText(this,"远程ContentResolver更新记录数为:"+count,Toast.LENGTH_SHORT).show();
- }
- public void delete(View source){
- //调用ContentResolver的delete()方法
- //实际返回的是该Uri对应的ContentProvider的delete()的返回值
- int count = contentResolver.delete(uri, "delete_where", null);
- Toast.makeText(this,"远程ContentResolver删除记录数为:"+count,Toast.LENGTH_SHORT).show();
- }
- }
4、UriMatcher
UriMatcher是方便对Uri进行操作的工具类,构造方法是:
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
该类包含两个方法:
- void addURI(String authority, String path, int code)
- int match(Uri uri)
其中authority和path组合成一个Uri,code是该Uri对应的标识码(用于区分多个Uri)。match()方法返回的是该Uri对应的标识码。
注:path中可以含有通配符“#”。假设某一个Uri的path为“word/#”,标识符为2,那么uriMatcher.match(Uri.parse(“content://com.providers.myprovider/word/10”))返回的值将会是2。
Android学习笔记(十六) ContentProvider的更多相关文章
- python3.4学习笔记(十六) windows下面安装easy_install和pip教程
python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference
目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...
- Android学习笔记(六)——活动的启动模式
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动的启动模式共有四种: standard.singleTop.singleTask 和 singleInst ...
- 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST
目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...
- (C/C++学习笔记) 十六. 预处理
十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...
- 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限
目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...
- 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项
[-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...
- 【转】 Pro Android学习笔记(六二):Preferences(6):header
目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...
随机推荐
- HDU1532 Drainage Ditches —— 最大流(sap算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/ ...
- asp.net cookie and session
客户端只保存session id,信息存在服务端 Session状态应该存储在两个地方,分别是客户端和服务器端. 客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器 ...
- 为什么越来越多公链项目将WASM拥入怀中?
最近越来越多的项目开始转向VNT使用的WASM,像EOS.Ontology,包括最初引入虚拟机EVM运行智能合约环境的以太坊,最近也开始转向使用WASM. 什么是WASM? WASM ,全称:WebA ...
- RESTful 架构与 RESTful 服务
风格 ⇒ 标准 ⇒ 协议 ⇒ 实现 Representational State Transfer,是一种软件架构风格,既然是风格,就非标准或协议,而是定义了一组设计原则和约束条件.具有如下特点: 适 ...
- 【前端】Element-UI 省市县级联选择器 JSON数据
转载请注明出处:http://www.cnblogs.com/shamoyuu/p/element_cascader.html 不想自己处理的就直接下载吧 http://shamoyuu.bj.bce ...
- Java AWT组件开发和Swing界面编程
一.AWT组件开发 1.AWT AWT是抽象窗口工具箱的缩写,它为编写图形用户界面提供了用户接口,通过这个接口就可以继承很多方法,省去了很多工作.AWT还能使应用程序更好地同用户进行交互. AWT中的 ...
- Sublime Text 常用的16 个 Sublime Text 快捷键
在我做了一次包含一些现场编码的演示后,一些观众问我是如何操作这么快.当然这里没有唯一的答案,答案是一堆简单的快捷键和大量的实践的组合.为了回应那些询问,我觉得有必要看看我每天想都不用想且使用的快捷键. ...
- CS231n 2016 通关 第一章-内容介绍
第一节视频的主要内容: Fei-Fei Li 女神对Computer Vision的整体介绍.包括了发展历史中的重要事件,其中最为重要的是1959年测试猫视觉神经的实验. In 1959 Harvar ...
- BZOJ3996 线性代数
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3996 转化题目给的条件 $$D = \sum_{i=1}^n \sum_{j=1}^n{A(i ...
- Codeforces - 1117E - Crisp String - 进制 - 交互
https://codeforces.com/problemset/problem/1117/E 就用abc表示数字来给每个数编码,编完直接问出移动的结果,反构造就行了,比C和D还简单. #inclu ...