千家信息网

Android中怎么创建自己的内容提供器

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本文小编为大家详细介绍"Android中怎么创建自己的内容提供器",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中怎么创建自己的内容提供器"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2026年11月03日Android中怎么创建自己的内容提供器

本文小编为大家详细介绍"Android中怎么创建自己的内容提供器",内容详细,步骤清晰,细节处理妥当,希望这篇"Android中怎么创建自己的内容提供器"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

创建内容提供器的步骤

前面已经提到过,如果想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentProvider 的方式来创建一个自己的内容提供器。 ContentProvider 类中有六个抽象方法,我们在使用子类继承它的时候,需要将这六个方法全 部重写。新建 MyProvider 继承自 ContentProvider,代码如下所示:

public class MyProvider extends ContentProvider {@Overridepublic boolean onCreate() {return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {return null;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {return 0;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {return 0;}@Overridepublic String getType(Uri uri) {return null;}}

在这六个方法中,相信大多数你都已经非常熟悉了,我再来简单介绍一下吧。

1. onCreate()

初始化内容提供器的时候调用。通常会在这里完成对数据库的创建和升级等操作, 返回 true 表示内容提供器初始化成功,返回 false 则表示失败。注意,只有当存在 ContentResolver 尝试访问我们程序中的数据时,内容提供器才会被初始化。

2. query()

从内容提供器中查询数据。使用 uri 参数来确定查询哪张表,projection 参数用于确 定查询哪些列,selection 和 selectionArgs 参数用于约束查询哪些行,sortOrder 参数用于 对结果进行排序,查询的结果存放在 Cursor 对象中返回。

3. insert()

向内容提供器中添加一条数据。使用 uri 参数来确定要添加到的表,待添加的数据 保存在 values 参数中。添加完成后,返回一个用于表示这条新记录的 URI。

4. update()

更新内容提供器中已有的数据。使用 uri 参数来确定更新哪一张表中的数据,新数 据保存在 values 参数中,selection 和 selectionArgs 参数用于约束更新哪些行,受影响的 行数将作为返回值返回。

5. delete()

从内容提供器中删除数据。使用 uri 参数来确定删除哪一张表中的数据,selection和 selectionArgs 参数用于约束删除哪些行,被删除的行数将作为返回值返回。

6. getType()

根据传入的内容 URI 来返回相应的 MIME 类型。 可以看到,几乎每一个方法都会带有 Uri 这个参数,这个参数也正是调用 ContentResolver的增删改查方法时传递过来的。而现在,我们需要对传入的 Uri 参数进行解析,从中分析出 调用方期望访问的表和数据。

回顾一下,一个标准的内容 URI 写法是这样的:

content://com.example.app.provider/table1

这就表示调用方期望访问的是 com.example.app 这个应用的 table1 表中的数据。除此之 外,我们还可以在这个内容 URI 的后面加上一个 id,如下所示:

content://com.example.app.provider/table1/1

这就表示调用方期望访问的是 com.example.app 这个应用的 table1 表中 id 为 1 的数据。 内容 URI 的格式主要就只有以上两种,以路径结尾就表示期望访问该表中所有的数据,以 id 结尾就表示期望访问该表中拥有相应 id 的数据。我们可以使用通配符的方式来分别匹 配这两种格式的内容 URI,规则如下。

1. *:表示匹配任意长度的任意字符

2. #:表示匹配任意长度的数字 所以,一个能够匹配任意表的内容 URI 格式就可以写成:

content://com.example.app.provider/*

而一个能够匹配 table1 表中任意一行数据的内容 URI 格式就可以写成:

content://com.example.app.provider/table1/#

接着,我们再借助 UriMatcher 这个类就可以轻松地实现匹配内容 URI 的功能。UriMatcher 中提供了一个 addURI()方法,这个方法接收三个参数,可以分别把权限、路径和一个自定义 代码传进去。这样,当调用 UriMatcher 的 match()方法时,就可以将一个 Uri 对象传入,返 回值是某个能够匹配这个 Uri 对象所对应的自定义代码,利用这个代码,我们就可以判断出 调用方期望访问的是哪张表中的数据了。修改 MyProvider 中的代码,如下所示:

public class MyProvider extends ContentProvider {public static final int TABLE1_DIR = 0;public static final int TABLE1_ITEM = 1;public static final int TABLE2_DIR = 2;public static final int TABLE2_ITEM = 3;private static UriMatcher uriMatcher; static {uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI("com.example.app.provider", "table1", TABLE1_DIR);uriMatcher.addURI("com.example.app.provider ", "table1/#", TABLE1_ITEM);uriMatcher.addURI("com.example.app.provider ", "table2", TABLE2_ITEM);uriMatcher.addURI("com.example.app.provider ", "table2/#", TABLE2_ITEM);}……@Overridepublic Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {switch (uriMatcher.match(uri)) {case TABLE1_DIR:// 查询table1表中的所有数据break;case TABLE1_ITEM:// 查询table1表中的单条数据break;case TABLE2_DIR:// 查询table2表中的所有数据break;case TABLE2_ITEM:// 查询table2表中的单条数据break;default:break;}……}……}

可以看到,MyProvider 中新增了四个整型常量,其中 TABLE1_DIR 表示访问 table1 表 中的所有数据,TABLE1_ITEM 表示访问 table1 表中的单条数据,TABLE2_DIR 表示访问 table2 表中的所有数据,TABLE2_ITEM 表示访问 table2 表中的单条数据。接着在静态代码 块里我们创建了 UriMatcher 的实例,并调用 addURI()方法,将期望匹配的内容 URI 格式传 递进去,注意这里传入的路径参数是可以使用通配符的。然后当 query()方法被调用的时候, 就会通过 UriMatcher 的 match()方法对传入的 Uri 对象进行匹配,如果发现 UriMatcher 中某 个内容 URI 格式成功匹配了该 Uri 对象,则会返回相应的自定义代码,然后我们就可以判断 出调用方期望访问的到底是什么数据了。

上述代码只是以 query()方法为例做了个示范,其实 insert()、update()、delete()这几个方 法的实现也是差不多的,它们都会携带 Uri 这个参数,然后同样利用 UriMatcher 的 match() 方法判断出调用方期望访问的是哪张表,再对该表中的数据进行相应的操作就可以了。

除此之外,还有一个方法你会比较陌生,即 getType()方法。它是所有的内容提供器都必 须提供的一个方法,用于获取 Uri 对象所对应的 MIME 类型。一个内容 URI 所对应的 MIME 字符串主要由三部分组分,Android 对这三个部分做了如下格式规定。

1. 必须以 vnd 开头。
2. 如果内容 URI 以路径结尾,则后接 android.cursor.dir/,如果内容 URI 以 id 结尾, 则后接 android.cursor.item/。
3. 最后接上 vnd..。
所以,对于 content://com.example.app.provider/table1 这个内容 URI,它所对应的 MIME

类型就可以写成:

vnd.android.cursor.dir/vnd.com.example.app.provider.table1

对于 content://com.example.app.provider/table1/1 这个内容 URI,它所对应的 MIME 类型 就可以写成:

vnd.android.cursor.item/vnd. com.example.app.provider.table1

现在我们可以继续完善 MyProvider 中的内容了,这次来实现 getType()方法中的逻辑, 代码如下所示:

public class MyProvider extends ContentProvider {……@Overridepublic String getType(Uri uri) { switch (uriMatcher.match(uri)) { case TABLE1_DIR:return "vnd.android.cursor.dir/vnd.com.example.app.provider.table1";case TABLE1_ITEM:return "vnd.android.cursor.item/vnd.com.example.app.provider.table1";case TABLE2_DIR:return "vnd.android.cursor.dir/vnd.com.example.app.provider.table2";case TABLE2_ITEM:return "vnd.android.cursor.item/vnd.com.example.app.provider.table2";default:break;}return null;}}

读到这里,这篇"Android中怎么创建自己的内容提供器"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

内容 数据 参数 方法 代码 期望 查询 格式 对象 类型 路径 文章 方式 时候 更新 成功 三个 功能 只有 字符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 合肥互联网科技公司 银优互联网科技有限公司 深圳卡尔迅互联网科技有限公司怎么样 华中科技有哪些互联网大佬 安控科技rtu产品工业互联网 农村开互联网科技讲堂 广州优美互联网科技 中国的互联网科技企业的崛起 以后互联网后是啥科技 晓花互联网科技有限公司网址 卓翼科技产业互联网合作 科技赋能视角下互联网保险发展 互联网第三次科技革命特征 从那以后互联网科技有限公司 2021世界互联网领先科技成果发布 江苏互联网智能科技产品出厂价 北京军民互联网科技公司 亚光科技低轨卫星互联网 互联网科技创业有什么好项目 互联网科技快速发展优美句子 互联网加科技 科技制造互联网公司 中国互联网科技发展 无线互联网科技 玉溪互联网科技怎么选 健康食品互联网创新科技园项目 互联网金融科技展 深圳艾果互联网通讯科技 合肥互联网科技公司公章图片 互联网领先科技宣传片
0