【Android -- 四大组件】ContentProvider 内容提供者

一、前言

ContentProvider 主要的作用就是将程序的内部数据和外部进行共享,为数据提供外部访问接口,被访问的数据主要以数据库的形式存在,而且还可以选择共享哪一部分的数据。这样一来,对于程序当中的隐私数据可以不共享,从而更加安全。
ContentProvider 是 Android 中一种跨进程通信共享数据的重要组件。

二、系统的 ContentProvider

系统的 ContentProvider 有很多,如通话记录、短信、通讯录等等,都需要和第三方的 App 进行共享数据。既然是使用系统的,那么 Contentprovider 的具体实现就不需要我们担心了,使用内容提供者的步骤如下:

  • 获取 ContentResolver 实例;
  • 确定 Uri 的内容,并解析为具体的 Uri 实例;
  • 通过 ContentResolver 实例来调用相应的方法,传递相应的参数,但是第一个参数总是 Uri,它制定了我们要操作的数据的具体地址。

可以通过读取系统通讯录的联系人信息,显示在 Listview 中来实践这些知识。不要忘记在读取通讯录的时候,在清单文件中要加入相应的读取权限。

三、自定义 ContentProvider

系统的 Contentprovider 在与我们交互的时候,只接受了一个 Uri 的参数,然后根据我们的操作返回给我们结果。系统到底是如何根据一个 Uri 就能够提供给我们准确的结果呢?只有自己亲自实现一个看看了。

和之前提到的一样,想重新自定义自己程序中的四大组件,就必须重新实现一个类,重写这个类中的抽象方法,在清单文件中注册,最后才能够正常使用。

重新实现 ContentProvider 之后,发现我们重写了 6 个重要的抽象方法:

  • oncreate()
  • query()
  • update()
  • insert()
  • delete()
  • gettype()

大部分的方法在数据库那里已经见过了,他们内部的逻辑可想而知都是对数据的增删改查操作,其中这些方法的第一个参数大多都是 Uri 实例。其中有两个方法比较特殊:

  • oncreate() 应该是内容提供者创建的时候所执行的一个回调方法,负责数据库的创建和更新操作。这个方法只有我们在程序中获取 ContentResolver 实例之后准备访问共享数据的时候,才会被执行。
  • gettype() 是获取我们通过参数传递进去的 Uri 的 MIME 类型,这个类型是什么,后面会有实例说明。

内容提供者首先要做的一个事情就是将我们传递过来的 Uri 解析出来,确定其他程序到底想访问哪些数据。Uri 的形式一般有两种:

1,以路径名为结尾,这种 Uri 请求的是整个表的数据.
如: tabl1 标识
我们要访问tabl1表中所有的数据
2,以id列值结尾,这种Uri请求的是该表中和其提供的列值相等的单条数据。
tabl1/1 标识
我们要访问tabl1表中_id列值为1的数据。

如果是内容提供器的设计者,那么我们肯定知道这个程序的数据库是什么样的,每一张表,或者每一张表中的 _id 都应该有一个唯一的内容 Uri 。我们可以将传递进来的 Uri 和我们存好的Uri进行匹配,匹配到了之后,就说明数据源已经找到,便可以进行相应的增删改查操作。

ContentProvider 的底层是采用 Android 中的 Binder 机制。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kevin-Dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值