最近一个小项目里用到了ContentProvider,这正好是我的薄弱环节,作为Android开发这么久,却很少接触ContentProvider的使用,正好借此机会学习总结一下。
在谈及ContentProvider之前,我想最好还是先聊一下Android中的数据,SQLite,这样我觉得更体系一些。
一、SQLite数据库
SQLite是一款轻型数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,占用资源非常小。支持多种操作系统。
二、SQLite的特点
1、轻量级
它是进程内的数据库引擎,不存在数据库的客户端和服务器,只需要带上它的动态库就能享受它的全部功能。
2、不需要安装
SQLite的核心引擎本身不依赖第三方软件,因此不需要安装
3、单一文件
数据库中所有信息都在一个文件内。
4、弱类型的字段
同一列中的数据可以是不同类型
三、SQLiteDataBase
Android提供了创建和使用SQLite数据库的API。SQLiteDataBase代表一个数据库对象,提供了操作数据库的一些方法。
1、openOrCreateDatabase方法
用于打开或创建数据库
2、insert方法
插入一条记录
3、delete方法
删除一条记录
4、query方法
查询一条记录
5、update方法
修改记录
6、execSQL方法
执行一条SQL语句
7、close方法
关闭数据库
四、使用细节
在我们使用数据库前,首先要做的就是打开或创建数据库。
之后创建表,创建表一般是使用SQL语句来创建。
之后就是常用的增删改查,插入有两种方法。一种是使用insert方法,插入ContentValues封装类。类里存储了列名称和列值得map。另外一种就是使用传统的SQL语句方法插入。其它的操作,也是分为两种,分别是提供的API和传统的SQL语句方式。
五、SQLiteOpenHelper
这个类是SQLiteDataBase的一个辅助类,这个类主要是生成一个数据库,并对数据库的版本进行管理。当调用它的可写或可读方法时,若数据库不存在,则创建一个数据库。这个类是一个抽象类,通常我们要继承并实现它的3个方法。
1、onCreate
在数据库第一次生成时调用这个方法。一般是在这一步生成表
2、onUpgrade
当数据库需要升级时调用。一般是删除旧表或建立新表在这一步。
3、onOpen
这个是当打开数据库时回调,一般不常用。
六、ContentProvider
经过前面的铺垫,现在可以来说说ContentProvider的使用方法了。
1、定义
ContentProvider是内容提供者,是Android四大组件之一。
2、作用
用于进程间数据的交互共享,即跨进程通信。其作为数据源的搬运工的角色。数据源可以是数据库数据如SQLite,文件,XML,网络等等。
3、原理
底层采用Android中的Binder机制,后续找时间展开
4、具体使用
4.1 统一资源标识符(URI)
外界进程通过URI找到对应的ContentProvider和其中的数据,在进行数据操作。
URI分为系统预置和自定义两部分。分别对应系统内置的数据如通讯录日程表等,还有自己定义的数据库。
自定义URI = 主题名 + 授权信息 + 表名 + 记录
通过上述组合就可以定位到具体到数据库中某一表中某一个数据。
值得注意的是,URI模式支持通配符匹配,可以使用通配符匹配任意长度的数据
4.2 MIME数据类型
作用:指定某个扩展名的文件用某种应用程序打开。
MIME类型由类型+子类型组成
例如text/css text/xml application/pdf
4.3 ContentProvider类
此类组织数据的方式主要是表格形式,同时也支持文件数据
主要方法如下
insert,delete,update,query
值得注意的是,如果是在多线程并发访问的时候使用,需要实现同步。
4.4 ContentResolver类
此类用于管理不同的ContentProvider间的操作。通过URI可以操作不同ContentProvider种的数据,外部进程通过ContentResolver类从而与ContentProvider类进行交互
4.5 ContentUris类
此类用于辅助ContentProvider,用于操作URI。可以通过withAppendedId方法向URI追加一个id。
可以通过parse方法从URL中获取ID。
4.6 UriMatcher类
此类用于辅助ContentProvider,用于在ContentProvider中注册URI。根据URI匹配ContentProvider中对应的数据表。
经过注册后, 就可以在使用uri时通过匹配不同的结果在switch语句里做不同的处理了。
4.7 ContentObserver类
此类用于辅助ContentProvider,用于内容观察者。观察Uri引起ContentProvider中数据变化并通知外界。使用时通过uri注册,当该uri的ContentProvider的数据发生变化时,通知外界。
5 进程间访问注意事项
ContentProvider是四大组件之一,在使用时要在Manifest文件里注册,并声明相关权限,这样才能保证被其它进程访问等操作。