您好!欢迎来到源码码网

Android ContentProvider(内容提供者)使用

  • 源码教程
  • 来源:源码码网
  • 编辑:admin
  • 时间:2021-02-20 19:48
  • 阅读:749

ContentProvider 是 Android 四大组件之一,用于保存和检索数据,是 Android 系统中不同应用程序之间共享数据的接口。

在 Android 系统中,应用程序之间是相互独立的,分别运行在自己的进程中,相互之间没有数据交换。若应用程序之间需要共享数据,就要用到 ContentProvider。

在 Android 系统的手机中,ContentProvider 最典型的应用是,当发送一条短信时,需要用到联系人的相关信息,此时就是通过 ContentProvider 提供的接口访问 Android 系统中的电话簿,并从中选择联系人。

ContentProvider 提供了一组应用程序之间能相互访问的接口。应用程序通过 ContentProvider 把当前应用中的数据共享给其他应用程序访问,而其他应用程序通过 ContentProvider 对指定应用中的数据进行访问和操作。

Android 系统对一系列常见的公用数据类型提供了对应的 ContentProvider 接口,例如视频、音频、图像、个人通信信息等,都定义在 android.provider 包下。

若应用程序开发者想将自己的数据公开给其他应用程序使用,有两种方法:

  • 定义自己的 ContentProvider 子类。

  • 将当前应用程序的数据添加到已有的 ContentProvider 中。


ContentProvider 中的数据在形式上和关系数据库中的表格很相似。

以 Android 系统内建的用户常用词典所对应的 ContentProvider 为例,Android 系统为其定义的名字为 android.provider.UserDictionary,该用户词典中的 Word 表格记录了特定用户经常使用的不规则单次的相关信息。其数据格式如下表所示。

ContentProvider数据格式

image.png

表头部分存储在 ContentProvider 中,表格的每一行是该词典数据的一个实例,也就是一个非标准的单词,每一列是和该单词相关的一些信息,例如该单词的拼写、使用者的 id、使用频率等,_ID 起到了主键的作用。

应用程序通过 ContentResolver 的对象访问 ContentProvider 中的数据,该对象提供了对持久层数据的 CRUD 方法。

每个 Activity 都有一个 ContentResolver 对象,要获取该对象,可以使用 Activity 提供的 getContentResolver() 方法。

当然,应用程序要使用其他应用程序提供的 ContentProvider,需要拥有进行操作的相应权限。所有用户词典数据的代码为:


mCursor=getContentResolver().query(UserDictionary.Words.CONTENT_URI,null,null,null,null)

其所对应的权限为:android.permission.READ_USER_DICTIONARY,因此必须在应用程序的 AndroidManifest.xml 文件中添加:

<uses-permission android:name="android.permission.READ_USER_DICTIONARY">

UserDictionary.Words.CONTENT_URI 指的是用户词典中 words 表的内容 URI。

ContentProvider 通过 URI 来共享数据。URI 是一个通用资源标志符,可将其分为 A、B、C、D 共 4 部分。

  • A:无法改变的标准前缀,包括“content://”“tel://”等。当前缀是“content://”时,说明在通过一个 ContentProvider 控制这些数据。

  • B:URI 的授权部分,一般为 ContentProvider 的全称,它通过 Android:authorities 属性声明,用于说明是哪个 ContentProvider 类提供这些数据,必须全部由小写字母组成,如 content://introduction.android.myprovider。

  • C:路径,可以理解为需要操作的数据库中表的名字,如“content:// introduction. android.myprovider /name”中的 name。

  • D:若 URI 中包含表示需要获取记录的 ID,则返回该 ID 对应的数据,若没有 ID,则表示返回全部数据,如 content://introduction.android.myprovider/name/01。


在本实例中,UserDictionary.Words.CONTENT_URI 包含所要访问 ContentProvider 的标识和具体信息表的路径。

其所代表的完整的字符串是“content://user_dictionary/words”,其中“content://”是前置格式字符串,即 A 部分;“user_dictionary”指定了提供数据的 ContentProvider,即 B 部分;“words”指定了要访问的数据表,即 C 部分。


此外,ContentProvider 允许通过在 URI 后面添加 ID 值的方式访问数据表中某一列数据,即添加 D 部分。例如,访问用户词典 words 表中 _ID=2 的数据的 URI 可以这样表示:


Uri singleUri=ContentUri.withAppendedId(UserDictionary.Words.CONTENT_URI,2);

其对应的完整 URI 为:“content://user_dictionary/words/2”。

ContentProvider 定义在 android.content 包下面,是一个抽象类。定义一个 Content Provider 必须实现下面几个抽象方法。

image.png

ContentResolver 提供的方法和 ContentProvider 提供的方法相对应,主要有以下几个方法。

image.png

在对某特定 ContentProvider 的 CRUD 操作中,通过 ContentResolver 提供的 CRUD 方法将相关信息传递给 ContentProvider,所提供的 CRUD 方法进而对数据进行操作。

因此,在定义自己的 ContentProvider 时,应该定义好该 ContentProvider 对数据进行 CRUD 操作时所使用的方法。

UriMatcher

Android 系统提供了 UriMatcher 类用于对 URI 的匹配。

使用步骤为:
1)创建 UriMatcher 类对象。
2)通过 UriMatcher.addURI(String,String,int) 方法对其增加需要匹配的 URI 路径,所对应的匹配码由第三个参数指定。
3)通过 UriMatcher.match(Uri) 方法进行匹配,并返回匹配码。

其代码如下:

image.png

上述代码中,uriMatcher.addURI("introdcuton.android.myprovider","text/#",2) 中“#”为通配符,代表任意数字,还可以使用通配符“*”来代表任意文本。这句话表示,若传入的 URI 能够匹配“content://introdcuton.android.myprovider/text/ 数字”格式,则返回匹配码 2。

特别声明:
1、如无特殊说明,内容均为本站原创发布,转载请注明出处;
2、部分转载文章已注明出处,转载目的为学习和交流,如有侵犯,请联系客服删除;
3、编辑非《源码码网》的文章均由用户编辑发布,不代表本站立场,如涉及侵犯,请联系删除;
全部评论(0)
推荐阅读
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 项目介绍《陀螺匠》是一套采用Laravel9框架结合Swoole高性能框架与Vue.js前端技术栈构建的AI+低代码双引擎智能办公系统。陀螺匠深度融合了AI智能体以及低代码开发平台,系统简约,易于功能扩展,方便二次开发。旨在为企业提供一站式、数智化转型的全方位解决方案,助力企业高效运营与智能决策。源码说明源码说明:项目代码100%开源,基于AGPL-3.0,支持免费商用!技术栈:系统基于Laravel9+Swoole+Vue.
  • 软件教程
  • 来源:CRMEB
  • 编辑:CRMEB
  • 时间:2026-03-27 15:33
  • 阅读:393
  • open claw最近很火,如何理性看待?
  • open claw最近很火,如何理性看待?
  • openclaw是2026年初科技圈最火爆的现象级话题。它不仅仅是又一个AI产品,更被百川智能的王小川誉为与ChatGPT诞生同等重要的里程碑——标志着AI从”只会说”的对话者,进化到了”能够做”的行动者。对于这股全民”养虾”热潮,我的观察是:它代表了一次人机关系的革命性跃迁,但同时也是一场充满风险与泡沫的狂欢,其真正的价值需要在喧嚣褪去、安全与成本的挑战被克服后才能显现。下
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-17 11:06
  • 阅读:432
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序是两种不同的开发模式,主要区别在于开发方式、性能表现、代码维护以及跨平台能力。为了让你更清晰地理解,我们可以把“原生”比作用钢筋水泥直接盖楼,而“封装”则是用预制板或套件来组装楼。以下是详细的对比分析:1.定义与本质原生小程序:定义: 直接使用微信官方提供的开发工具、语法和API进行开发。语言: 使用微信自己定义的一套技术栈(WXML(微信标记语言)做结构、WXSS(微信样式表)做样式、JS
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-06 11:54
  • 阅读:666
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • FytSoaCms一款基于NetCore2.2/3.1(RazorPage)功能强大的Cms建站系统,支持前后端分离。简介:模块化:全新的架构和模块化的开发机制,便于灵活扩展和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目可以实现差异化的功能,轻松实现诸如资讯、下载、讨论和图片等功能。通过分类信息和栏目绑定,可以自动建立索引表,轻松实现复杂的信息检索。FytSoa是一套基于NetCore+SqlS
  • 开发工具
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 22:21
  • 阅读:592
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • SmartWx微信公众号管理系统是一个完整的微信公众号web操作版,直接编译即可运行。让用户不再用关心微信的底层接口,直接使用页面进行操作,简单方便。包括服务器绑定、文本管理、图文管理、菜单管理、粉丝管理、群发消息等。技术框架开发语言:JAVA数据库:MYSQLJAVA开发框架:SpringMVC+Spring+Mybatis缓存框架:j2cache前端开发框架:Layui+JQuery+html前台模板引擎:art-templat
  • 源码教程
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 21:53
  • 阅读:601
联系客服
源码代售 源码咨询 技术开发 联系客服
029-84538663
手机版

扫一扫进手机版
返回顶部