Android开发笔记(七)- Data Storage & Content Provider组件
这篇文章将会介绍继Activity组件,Service组件,BroadcastReceiver组件之后的最后一个组件:ContentProvider组件。相比于前三个组件,ContentProvider的概念和用法都相对简单,所以在这里再补充比较一下安卓开发中比较常见的数据存储方式及其异同。
Content Provider
Google开发文档中给出对于ContentProvider的介绍是:
Content providers are one of the primary building blocks of Android applications, providing content to applications. They encapsulate data and provide it to applications through the single
ContentResolver
interface
这里要注意几个问题:
- ContentProvider适用于不同Application之间共享数据的情况,比如有多个App需要同时读取通讯录中的联系人信息,因为实际上ContentProvider只是提供一种可供多个App进行数据共享的“桥梁”。
- 数据提供方需要实现ContentProvider中定义的
onCreate / getType / insert / delete / update / query
这几个方法,通过某种具体的存储数据的方式(Sqlite数据库,文件存储或者网络存储等)来实现这些方法; - 数据访问方需要通过
Context.getContentResolver()
获得一个ContentResolver
实例,然后使用提供的query / insert / delete / update
等方法进行共享数据的CRUD操作; - ContentProvider中的数据通过唯一的统一资源标识符(URI)来标识其来源,具体格式为:
URI = content://authority/path/id
,各部分的具体含义在下面的使用实例中介绍。
ContentProvider使用实例
1. 定义Contract帮助类,声明需要的常量
1 | internal object DemoDatabaseContract { |
这里的常量主要用于: 1. 通过SQLiteOpenHelper
类来创建具体的数据存储实例来实现ContentProvider
中的各种方法;2. 在ContentProvider
类中用于定义URI以及进行匹配操作(URI matching)。统一资源标识符的具体格式为:
- 主题名(Schema):ContentProvider的URI前缀,Android统一规定;
- 授权信息(Authority):ContentProvider的唯一标识符,用于区分不同的ContentProvider;
- 表名(Path):ContentProvider内单个表格的唯一标识符,用于区分不同表格;
- 记录(ID):表格内的某一条记录,如果为空则返回全部记录。
2. 实现具体的ContentProvider类
1 | class DemoContentProvider : ContentProvider() { |
这里需要注意,通过uriMatcher.addURI()
方法可以添加一个需要进行匹配的URI并赋予其一个MATCH_CODE,在使用uriMatcher.match(uri)
方法时,如果传入的uri和已经添加的URI匹配时,则会返回这个MATCH_CODE。通过这个方法,我们可以进行更加精准的URI匹配确认,例如:
1 | override fun query( |
从这个query()方法可以看到,只有当传入的uri与已添加的URI进行匹配并返回对应的MATCH_CODE时,才会对数据库进行查找操作。
3. 实现一个数据访问方实例
1 | class MainActivity : AppCompatActivity() { |
由此可见,通过this.contextResolver
可以获得一个ContentResolver
实例,而通过这个ContentResolver
实例,就可以在不同的Activity,Application之间对于同一个ContentProvider内的数据进行增删改查等操作。
Other Data Storage
除了上面提到的ContentProvider之外,Android中还提供其它几种数据存储的方式,这里简单介绍一下各自的特点,以后会逐一详细介绍。
Share Preference
SharedPreferences是Android平台上的一个比较轻量级的存储类, 它使用xml文件存放数据,非常适合用于存放配置参数。它的特性包括:
xml文件按key-value对存储,可保存int,boolean,String,float,long和StringSet共六种类型;
模式参数包括:
MODE_PRIVATE
(只能在APP内部被访问,覆盖已有内容),MODE_APPEND
(只能APP内部访问,追加已有内容),MODE_WORLD_READABLE
(外部程序可读,但不可写),MODE_WORLD_WRITEABLE
(外部程序可读且可写);apply()
和commit()
均可用于提交内容修改,但是apply()方法没有返回值,而commit()方法会返回boolean表示是否修改成功;apply()
方法只是原子提交到内存,并未立刻提交到磁盘。而commit()
方法是同步提交磁盘,效率较低,对结果不关心且无后续操作的话,建议使用apply()。
Internal Storage
Ineternal Storage是指APP内部的存储空间。它只对当前APP开放(private to app),并且当APP被卸载时,其内容会被全部清除。它主要包含两个部分:cache directory(通过getCacheDir()
方法调用)以及permanent file directory(通过getFilesDir()
方法调用)。
其他存储方式
除了上面提到的两种方式之外,还有例如SQlite数据库存储,网络云端存储等方式,在以后的过程中一一介绍。这篇主要针对ContentProvider组件介绍的文章希望对你有帮助,谢谢!