http://blog.csdn.net/sadfishsc/article/details/7419573

1.   适用范围

对于什么情况下才会用到自定义的ContentProvider,官方文档的Dev Guide是这样描述的:

如果你想要提供以下的一种或几种特性的时候你才需要构造一个ContentProvider:

  • 你想要为其它的应用提供复杂的数据或者文件;
  • 你想允许用户从你的应用中拷贝复杂的数据到其它的应用中;
  • 你想要使用搜索框架来提供自定义的搜索策略。

你完全不需要ContentProvider来调用一个SQLite数据库,如果这种调用完全在你自己的应用之中。

也就是说,ContentProvider的作用是为别的应用调用本应用中的数据或者文件提供接口,而它也是唯一的跨应用数据传递的接口。如果仅仅是同一个应用中的数据传递,则完全没有必要使用到自定义的ContentProvider。

另一方面,虽然ContentProvider也能组织文件数据或者SharedPreferences(其实也是文件数据)这种数据,但大多数情况下ContentProvider是作为SQLite数据库的调用接口来被继承的。其原因大概是在于重写的query()方法始终需要返回Cursor,而Cursor作为数据库数据的容器,并没有提供直接往Cursor中写入数据的方法。

2.   大体实现步骤

1.      创建一个数据源,例如继承SQLiteOpenHelper创建一个SQLite数据库;

2.      创建一个继承自ContentProvider的类,并重写insert、delete、query、update、getType、onCreate方法,在这些方法中实现对数据源的操作;

3.      在AndroidManifest.xml文件中添加<provider>标签,两个必写的属性是android:name和android:authorities;

4.      在本应用或者其它应用的Activity、Service等组件中使用ContentResolver通过对应的URI来操作该自定义ContentProvider。

3.   URI

Android各种类型的URI基本上都是有固定格式的,对于ContentProvider而言,一般形如

content://com.test.cp.MyProvider/phone/1

的URI,其中:

content://是固定字段,必需;

com.test.cp.MyProvider表示authority,是AndroidManifest.xml文件中<provider>标签的android:authorities属性值,或者是远程数据源的主机名,必需;

phone/1表示path,是数据源路径,非必需,其中的phone对于数据库来说可以视为表名,1表示的是该条数据的编号,如果没有则一般认为是返回当前路径(当前表)中的所有数据。

另外还可以根据自己的需要来进一步定义后续的字段。

4.   onCreate方法与构造方法

ContentProvider没有显式地执行初始化的语句,因此即便是重写了它的构造方法也不会被执行。它的初始化代码一般都写在onCreate方法中。但是网上的例子中也有部分初始化代码被写在了静态域之中(主要是关于UriMatcher的初始化代码)。不过经过本人测试发现,把这些放在静态域中的代码移到onCreate方法中也不会影响程序的运行。

另外需要注意的是必须把onCreate方法的返回值该为true,该ContentProvider才能被加载。

5.   UriMatch对象

UriMatch对象的作用是将URI匹配到对应的表(就数据库而言),其使用步骤如下:

1.        通过new  UriMatcher(UriMatcher.NO_MATCH); 实例化,常量NO_MATCH作为参数表示不匹配任何URI;

2.        实例化后调用addURI方法注册URI,该方法有三个参数,分别需要传入URI字符串的authority部分、path部分以及自定义的整数code三者;

3.        在其它地方调用match方法匹配相应的URI,需要传入Uri作为唯一的参数,返回上述自定义的code值。

至于其初始化的位置,如前所述,网上绝大多数示例都将其放入静态域中实例化,原因不明。实际上放到onCreate方法中也没什么问题。

6.   getType方法

ContentProvider必须重写的6个方法中,除了初始化方法onCreate以及数据操作的4个方法以外,还有一个getType方法。它的作用是根据URI返回该URI所对应的数据的MIME类型字符串。这种字符串的格式分为两段:“A/B”。其中A段是固定的,集合类型(如多条数据)必须是vnd.android.cursor.dir,非集合类型(如单条数据)必须是vnd.android.cursor.item;B段可以是自定义的任意字符串;A、B两段通过“/”隔开。这个MIME类型字符串的作用是要匹配AndroidManifest.xml文件<activity>标签下<intent-filter>标签的子标签<data>的属性android:mimeType。如果不一致,则会导致对应的Activity无法启动。

7.   notifyChange方法

网上的某些示例中在重写insert、delete、update、query方法对数据的操作结束之后,总会加一句代码:

getContext().getContentResolver().notifyChange(uri,null);

其作用是通知在ContentResolver中注册了该URI的ContentObserver,这个URI对应的数据源发生变化了。其具体用法参见下面的链接:

http://blog.csdn.net/zhf198909/article/details/6903708

另外,通知变化对于ContentProvider来说并不是必需的,根据实际功能的需要,自定义的ContentProvider中多数情况下并不需要这句代码。

8.   示例

http://www.cnblogs.com/chenglong/articles/1892029.html

转载于:https://www.cnblogs.com/qiufeihai/p/3467512.html

自定义ContentProvider的一些细节探究相关推荐

  1. Android之自定义ContentProvider详解

    第一个版本  对android中MIME类型的理解 初始MIME类型,是在学习ContentProvider的时候. 当在创建自己的ContentProvider的时,需要从抽象类ContentPro ...

  2. 四大组件之ContentProvider(二)-轻轻松松自定义ContentProvider

    更新时间 修改意见 2016-08-02 陈敏 第3节 自定义ContentProvider 自定义一个ContentProvider,需要 继承ContentProvider类重新创建一个类,并实现 ...

  3. Study on Android【五】--自定义ContentProvider的语义

    Android做到现在.开始感觉到Android确实还是太年轻.系统本身好不够成熟,相关文档更是少的可怜.在Android的旅途中到处是暗坑陷阱,掉进去摔得半死,还只能靠自己琢磨着爬出来. 想 在大部 ...

  4. Android 节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)

    首先,还是展示一下部分目录结构:  在节日短信送祝福的功能实现方面,为了能够方便直观展示实现过程,小编我以Java文件为基础,一个一个来展示,免得到时候这个java文件写点,一下又跳到另外一个java ...

  5. Android-节日短信送祝福(功能篇:1-数据库操作类与自定义ContentProvider)

    郑重声明:[慕课网–中级教程]系列的博文均是根据慕课网上的Android开发中级教程相应的视频,在学习之后写的,文中所涉及的源码与视频中的无太大区别,除开个别地方可能有所改善或者加入了自己的想法.如果 ...

  6. Angular系列学习二:基本的组件说明、自定义组件和部分细节说明

    作者:心叶 时间:2018-07-24 16:41 基本说明 组件是Angular中非常重要的一个东西,是拥有模板的指令,是构成Angular应用的基础和核心,被用来包装特定的功能,应用程序的有序运行 ...

  7. joblib自定义类的使用细节

    问题根源: 问题描述: 自定义类与joblib保存的代码放在一块: one.py: class Own():      pass if __name__=="__main__": ...

  8. Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用

    现在,ContentProvider已经创建好了,可以去尝试使用一下. 1. 使用之前的工程,在布局文件main.xml中添加一些控件. <?xml version="1.0" ...

  9. [Zer0pts2020]easy strcmp细节探究

    这道题大多数的wp不知道这个程序是怎么跑的. 这道题是由一个知名的日本战队zer0pts出的,还是挺新颖,挺有意思的 总体感知 首先来看看ida里的情景 这就是main函数的所有了,很简单,感觉啥也没 ...

最新文章

  1. Task04:青少年软件编程(Scratch)等级考试模拟卷(一级)
  2. 赛灵思PLL重配置一PLL配置介绍___S6器件族
  3. 如何更改微信标签名字_微信透明昵称代码复制
  4. MFC 单文档如何修改背景。
  5. PAT-乙级-1020. 月饼 (25)
  6. Boost字符串处理
  7. C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区...
  8. 从芯片到 AI 生态,52 岁英特尔的蜕变!
  9. QPSK调制原理及python实现
  10. OpenGL采样贴图显示不出来
  11. 电机转矩、功率、转速之间的关系及计算公式
  12. 【重识云原生】第三章云存储第一节——分布式云存储总述
  13. 物联网关键技术:时序数据库
  14. 补充:混淆矩阵、图像分割指标计算
  15. Android 网络框架 Retrofit2.0介绍、使用和封装
  16. 元学习入门:MAML
  17. 安全狗陈荣有:打造“即开即用”的云原生安全能力
  18. win10正确清理C盘
  19. 解决MySQl卸载卸不干净问题
  20. 一道选择题,让我搞懂了嵌套函数的基本运行逻辑

热门文章

  1. 【ABP杂烩】Extensions后缀扩展方法
  2. Luogu 2296 寻找道路
  3. SQLServer出现不允许保存更改的问题解决
  4. es6+angular1.X+webpack 实现按路由功能打包项目
  5. 软件工程习题2第三小题
  6. spark python入门教程_你是如何自学 Python 的?
  7. phpthink验证旧密码_忘记MacBook密码解决方法
  8. matlab抓取股票数据,Matlab通过sina web接口获取个数即时股票数据函数实现代码
  9. php.exe系统错误,PhpStorm中报 “Cannot run program git.exe, 系统找不到指定的文件” 错误的解决方法...
  10. adb指令通过uid控制_图文教程:PC利用adb工具通过CMD命令控制手机动作(备忘笔记)...