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进行匹配,匹配到了之后,就说明数据源已经找到,便可以进行相应的增删改查操作。