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的更多相关文章

  1. python3.4学习笔记(十六) windows下面安装easy_install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart

    目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...

  3. 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET

    目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...

  4. 【转】 Pro Android学习笔记(六十):Preferences(4):MultiSelect List Preference

    目录(?)[-] XML文件 在设备中保存 读出信息 ListPreference提供单选列表,我们可以通过CheckBoxPreference提供多选列表.此外,Android在3.0后提供Mult ...

  5. Android学习笔记(六)——活动的启动模式

    //此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 活动的启动模式共有四种: standard.singleTop.singleTask 和 singleInst ...

  6. 【转】 Pro Android学习笔记(六八):HTTP服务(2):HTTP POST

    目录(?)[-] 找一个测试网站 HTTP POST小例子 上次学习了HTTP GET请求,这次学习一下HTTP POST. 找一个测试网站 小例子好写,但要找个测试网站就有些麻烦,一下子无从入手,都 ...

  7. (C/C++学习笔记) 十六. 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  8. 【转】 Pro Android学习笔记(六五):安全和权限(2):权限和自定义权限

    目录(?)[-] 进程边界 声明和使用权限 AndroidManifestxml的许可设置 自定义权限 运行安全通过两个层面进行保护.进程层面:不同应用运行在不同的进程,每个应用有独自的user ID ...

  9. 【转】 Pro Android学习笔记(六三):Preferences(7):代码控制首选项

    [-] 代码实现preference 利用preference保存状态 DialogPreference 代码实现preference View可以不通过xml进行设置,有代码直接进行设置,首选项pr ...

  10. 【转】 Pro Android学习笔记(六二):Preferences(6):header

    目录(?)[-] 代码实现 header xml文件 在前面的例子,我们主要学习了PreferenceScreen的xml如何写,preference有哪些类型.在代码中,我们为了不提示warning ...

随机推荐

  1. 计算机学院大学生程序设计竞赛(2015’12)Pick Game

    Pick Game Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 织梦CMS使用JS实时动态调用评论数

    网站中只要启用了会员系统,网站中的文章就会有评论,在网站首页中调用会员评论也能提升会员体验度,网页都是静态页面,如果每有一个评论都更新html的话就会有点浪费资源了,所以这里给大家分享一个使用JS调用 ...

  3. MYSQL进阶学习笔记十一:MySQL 表的分析,检查和优化!(视频序号:进阶_28)

    知识点十二:MySQL 表的分析,检查和优化(28) 表的分析,检查和优化: 定期分析表: ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, ...

  4. MySQL数据库设计常犯的错以及对性能的影响

    1.过分的反范式化为表建立太多的列 我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于M ...

  5. iOS自定义提示弹出框(类似UIAlertView)

    菜鸟一枚,大神勿喷.自己在牛刀小试的时候,发现系统的UIAlertView有点不喜欢,然后就自己自定义了一个UIAlertView,基本上实现了系统的UIAlertView,可以根据项目的需求修改UI ...

  6. LA-3905 (扫描线)

    题意: 给一些流星的初始位置和运动向量,给了相机的拍摄范围;问你最多能拍到多少颗流星; 思路: 将流星用出现在相机拍摄范围内的时间段表示;sort后在扫面端点更新最大值; Ac代码: #include ...

  7. 枚举子集 Codeforces306 Div2 B

    题目 分析:用二进制法去枚举子集,同时判断满足条件的子集个数加1 #include "iostream" #include "cstdio" using nam ...

  8. printf(“%06d\n”,x);

    %06d : %是格式化输入接受参数的标记 0格式化命令:结果将用零来填充 6:填充位数 d:代表十进制 数据 printf(“%06d\n”,x); console: 000001 000002 0 ...

  9. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时7

    课时7 线性分类器损失函数与最优化(下) 我们为什么要最大化对数概率而非直接最大化概率? 你在做逻辑斯蒂回归时,如果你只是想要最大化概率,那你使用log是无意义的.因为log函数是单调函数,最大化概率 ...

  10. OLE/COM Object Viewer

    OLE/COM Object Viewer摘AutoIt Help The "OLE/COM Object Viewer" is a very handy tool to get ...