想要实现跨程序共享数据需要用到内容提供器,内容提供器给别的应用提供了访问接口,可以新建一个类去继承ContentProvider来创建一个自己的内容提供器。ContentProvider类中有6种抽象方法,在使用子类继承的时候需要全部重写。

 1 public class Myprovider extends ContentProvider {
 2
 3     @Override
 4     /*
 5     初始化时调用
 6     通常会在这里完成对数据库的创建和升级等操作,返回true表示初始化成功。
 7     只有当存在ContentResolver尝试访问程序中的数据时,才会进行初始化。
 8      */
 9     public boolean onCreate() {
10         return false;
11     }
12
13     /*
14     查询数据
15     uri 确定查询的是那一张表
16     projection 查询那一列
17     selection 和 selectionArgs查询那些行
18     sortOrder 对结果进行排序
19     返回的数据存放在Cursor对象中
20      */
21     @Override
22     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {
23         return null;
24     }
25
26     /*
27     根据传入的数据URI来返回相应的MIME类型
28      */
29     @Override
30     public String getType(Uri uri) {
31         return null;
32     }
33     /*
34     添加数据
35     uri 确定添加的是那一张表
36     values 保存待添加的数据
37     返回一条表示这条新记录的URI
38      */
39     @Override
40     public Uri insert(Uri uri,  ContentValues values) {
41         return null;
42     }
43     /*
44     删除数据
45     selection 和 selectionArgs 删除那些行
46     返回被删除的行数
47      */
48     @Override
49     public int delete(Uri uri,  String selection,  String[] selectionArgs) {
50         return 0;
51     }
52     /*
53     更新已有的数据
54     uri 确定更新的是那一张表
55     values 新数据
56     selection 和 selectionArgs 更新那些行
57     会返回更新的行数
58      */
59     @Override
60     public int update(Uri uri,  ContentValues values,  String selection,  String[] selectionArgs) {
61         return 0;
62     }
63
64 }

  一个标准的内容URI写法是这样的:

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

  这就表示想要访问com.example.app这个应用中的table1表中的数据

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

  这表示想要访问com.example.app这个应用中的table1表中的id为1的数据

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

  这表示想要访问com.example.app这个应用中的任意表

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

  这表示想要访问com.example.app这个应用中的table1表中的任意行的数据

  其中 * 表示任意长度的任意字符  # 表示任意长度的数字

  然后使用UriMatcher这个类实现匹配内容URI的功能,UriMatcher中有一个addURI()的方法,3个参数,可以分别把authority、path、和一个自定义代码,当调用UriMatcher的match()方法是,将一个URI传入,返回值某个能够匹配这个URI的自定义代码。

  修改后的代码:

  

 1 public class Myprovider extends ContentProvider {
 2
 3     //用于识别URI的自定义代码
 4     public static final int TABLE1_DIR = 0;
 5
 6     public static final int TABLE1_ITEM = 1;
 7
 8     public static final int TABLE2_DIR = 2;
 9
10     public static final int TABLE2_ITEM = 3;
11
12     //创建UriMatcher的实例
13     private static UriMatcher uriMatcher;
14
15     //将自定义代码和希望的URI匹配
16     static {
17         uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
18         uriMatcher.addURI("xbt.exp11.provider","table1",TABLE1_DIR);
19         uriMatcher.addURI("xbt.exp11.provider","table1/#",TABLE1_ITEM);
20         uriMatcher.addURI("xbt.exp11.provider","table2",TABLE2_DIR);
21         uriMatcher.addURI("xbt.exp11.provider","table2/#",TABLE2_ITEM);
22
23     }
24     ...
25     /*
26     查询数据
27     uri 确定查询的是那一张表
28     projection 查询那一列
29     selection 和 selectionArgs查询那些行
30     sortOrder 对结果进行排序
31     返回的数据存放在Cursor对象中
32      */
33     @Override
34     public Cursor query(Uri uri,  String[] projection,  String selection,  String[] selectionArgs,  String sortOrder) {
35
36         //判断希望被访问的数据是什么数据
37         switch (uriMatcher.match(uri)){
38             case TABLE1_DIR:
39                 //查询table1表中的所有数据
40                 break;
41             case TABLE1_ITEM:
42                 //查询table1表中的单条数据
43                 break;
44             case TABLE2_DIR:
45                 //查询table2表中的所有数据
46                 break;
47             case TABLE2_ITEM:
48                 //查询table2表中的单条数据
49                 break;
50             default:
51                 break;
52         }
53         ...
54     }
55
56     ...
57
58 }

  insert()、update()、delete()也可以使用switch (uriMatcher.match(uri)){..}这样的判断语句判断出希望访问的是那张表,再进行相应的操作

  getType()方法是一个所有的内容提供器都必须提供的一个方法,用于获取Uri对象所对应的MIME类型。

  一个内容URI所对应的MIME字符串主要由3部分组成,android的格式规定是:

  1、必须以vnd开头

  2、如果内容URI以路径结尾,则后接android.cursor.dir/,如果内容URI以id结尾,则后接android.cursor.item/

  3、最后接上vnd.<authority>.<path>

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

  vnd.android.cursor.dir/vnd.example.app.providder.table1

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

  vnd.android.cursor..item/vnd.example.app.providder.table1

  实现getType()方法的逻辑如下:

public class Myprovider extends ContentProvider {.../*根据传入的数据URI来返回相应的MIME类型*/@Overridepublic String getType(Uri uri) {switch (uriMatcher.match(uri)){case TABLE1_DIR:return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table1";case TABLE1_ITEM:return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table1";case TABLE2_DIR:return "vnd.android.cursor.dir/vnd.xbt.exp11.provider.table2";case TABLE2_ITEM:return "vnd.android.cursor.item/vnd.xbt.exp11.provider.table2";default:break;}return null;}
}

转载于:https://www.cnblogs.com/xxbbtt/p/7429380.html

android--创建自己的内容提供器相关推荐

  1. android 提供的方法,Android编程之创建自己的内容提供器实现方法

    本文实例讲述了Android编程之创建自己的内容提供器实现方法.分享给大家供大家参考,具体如下: 我们学习了如何在自己的程序中访问其他应用程序的数据.总体来说思 路还是非常简单的,只需要获取到该应用程 ...

  2. 创建自己的内容提供器

    如果想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器.ContentProvider类中有6个抽象 ...

  3. Android入门(13)| Android权限 与 内容提供器

    文章目录 普通权限与危险权限 运行时申请权限 内容提供器 运用安卓封装好的内容提供器 自实现的内容提供器 概念 实现 普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上,实现数 ...

  4. Android 内容提供器---简介

    内容提供器管理结构化的数据集的访问.它们封装数据.提供定义数据安全的机制.内容提供器是用运行在另一个进程中的代码连接另一个进程中的数据的标准接口. 当你想要访问内容提供器中的数据时,使用应用程序的Co ...

  5. 内容提供器(Content-Provider)完整使用指南

    [TOC] 1. 什么是内容提供器? ​ 内容提供器(Content Provider) 主要用于在不同的应用程序之间实现数据的共享功能,他提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同 ...

  6. 第一行代码学习笔记第七章——探究内容提供器

    知识点目录 7.1 内容提供器简介 7.2 运行权限 * 7.2.1 Android权限机制详解 * 7.2.2 在程序运行时申请权限 7.3 访问其他程序中的数据 * 7.3.1 ContentRe ...

  7. 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider)

    [索引页] [×××] 系出名门Android(9) - 数据库支持(SQLite), 内容提供器(ContentProvider) 作者:webabcd 介绍 在 Android 中使用 SQLit ...

  8. android内容提供器读取图片,android实现拍照或从相册选取图片

    从相册或拍照更换图片功能的实现:(取图无裁剪功能) 获取图片方式: (类似更换头像的效果) 1.手机拍照 选择图片: 2.相册选取图片: 本文只是简单实现该功能,页面展示有些简陋,运行效果图如下: 创 ...

  9. 第七章:跨程序共享数据-探究内容提供器

    运行时权限 Android 6.0 之后的系统提供了两种权限: 普通权限.例如:访问网络状态.监控开机是否完成等.这种权限会在安装 APP 时询问用户是否同意. 危险权限,也就是说运行时权限,需要在程 ...

最新文章

  1. python中文件读写位置的作用-文件操作,读,写,指定位置
  2. 1803无法升级到2004_今年的Win10更新很特别,不要随便升级!
  3. 解决Mac下安装新版本IDEA无法启动
  4. day 04 作业 循环和分之
  5. redis.conf配置文件详解
  6. Java SecurityManager checkPackageDefinition()方法与示例
  7. 围绕央行系统升级所产生的常见问题
  8. Android图片加载之认识bitmap的四种加载方式
  9. Java多线程(五)——多线程的多线程池
  10. 新手如何让淘宝店铺的销量提升, 该如何做!
  11. 机械硬盘和固态硬盘区别 机械硬盘和固态硬盘哪个好
  12. curl 请求日志_CURL常用命令
  13. 无线通信——C-V2X是什么?
  14. 英语它在计算机旁边怎么读,计算机的英语怎么读?
  15. dart-sass 和 node-sass 的区别
  16. 实现用户输入用户名和密码登录
  17. HDU5438--Ponds (拓排+BFS)
  18. 关于 vue3.0 实战项目 setup、 props、 reactive、ref
  19. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)
  20. busybox源码介绍

热门文章

  1. JMM中的原子性、可见性、有序性和volatile关键字
  2. Matlab dir函数
  3. 梯度下降原理及在线性回归、逻辑回归中的应用
  4. 计算机在线平方,完全平方数批量判断在线计算器_三贝计算网_23bei.com
  5. html文件上传协议,HTTP 上传文件的协议格式
  6. 粒子群算法(PSO)Matlab实现(两种解法)
  7. Python中字符串使用方法总结(学习笔记)
  8. @loj - 6353@「CodePlus 2018 4 月赛」组合数问题 2
  9. 关于简单动态规划(Dynamic Programming)的总结
  10. Python 操作 MySQL 的正确姿势