终于又回到组件篇,Android中非常重要的四大组件–Activity、ContentProvider、BroadcastReceiver和Service,它们分工明确,共同构成了可重用、灵活、低耦合的安卓系统。通过之前的学习,我们知道Activity主要负责UI加载和页面跳转,接下来几篇就依次介绍后三种组件,本篇先学习ContentProvider,目录见下:
- ContentProvider概要
- 从系统提供的Provider访问数据
- 内容URI的组成
- ContentResolve类
- 例子:读取联系人的电话
- 创建自己的Provider
- UriMater类
- 自定义一个Provider的步骤
- 例子:为student.db创建MyProvider
1.ContentProvider概要
ContentProvider也有存储数据的功能,但与上一篇中学习的那三种数据存储方法不同的是,后者保存下的数据只能被该应用程序使用,而前者可以让不同应用程序之间进行数据共享,它还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏风险。所以组件ContentProvider主要负责存储和共享数据。
ContentProvider有两种形式:可以使用现有的内容提供者来读取和操作相应程序中的数据,也可以创建自己的内容提供者给这个程序的数据提供外部访问接口。下面分别学习一下。
2.从系统提供的Provider访问数据
既然ContentProvider有对外共享数据的功能,换句话说,其他应用程序可以通过ContentProvider对应用中的数据进行增删改查,说到这里是否感到熟悉?上篇学习SQLite数据存储的时候就提到过可以实现增删改查的各种辅助性方法,实际上ContentProvider是对SQLiteOpenHelper的进一步封装,因此它们使用的方法太像了,只不过不再用单纯的表名指明被操作的表,毕竟现在是其他程序访问它,而是用有一定格式规范的内容URI来代替。下面先来学习URI的组成。
(1)内容URI的组成
以上篇最后做的关于数据库的demo为例,它的包名是com.example.myapplication,如果其他程序想访问该程序student.db中的student表,那么需要的内容URI如图所示:
可以看出内容 URI 可以非常清楚地表达出我们想要访问哪个程序中哪张表里的数据,但还没完,还需要将它解析成 Uri 对象才可以作为参数传入。通过调用 Uri.parse()方法,就可以将内容 URI 字符串解析成 Uri 对象了,代码如下:
(2)ContentResolve类
现在有了酷似“表名”的Uri,类似的,在ContentResolver类中提供的一系列用于对数据进行增删改查操作的方法也酷似SQLiteDatabase的那些辅助性方法:insert()方法用于添加数据,update()