这是我参与「第四届青训营 」笔记创作活动的第9天
数据存储
简介
- 数据存储的方式有很多种,其使用场景也不一样,本文主要介绍其中4种最为常见的数据存储方式和使用场景
- 数据库是4种常见数据存储方式中较为复杂的能力,本文也会重点介绍
存储方式对比
常见的数据存储主要有四种:
数据库开源框架对比
主流数据库开源框架对比
Room数据库的使用
主要有三个组件:
- 数据库类,用于保存数据库并作为应用持久性数据底层链接的主要访问点
- 数据实体,用于表示应用的数据库的表
- 数据访问对象,提供应用的可用查询、更新、插入和删除数据库中的数据的方法
Room接入
Gradle目录的build.gradle文件里添加如下:
dependencies{
def room_version = "2.4.2"
implementation "android.room:room-runtime:$room_version"
kapt "android.room:room-compiler:$room_version"
//其他依赖
}
数据表设计
下面假设设计一个表,表名为user,数据表包含uid、first_name、 last_name 3个字段
新建Entity
定义一个User数据实体,User的每个实例都代表App数据库中的user表的一行
新增DAO
定义一个名为UserDao的DAO。用来对User表的增删改查
新建数据库类
- 新增一个
RoomDatabase的abstract子类
- 子类需加注解
@Database(entities = [xxx], version = n),entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
- 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例
获取dao对象
可进行数据库的增删改查操作
Room原理介绍
核心
- 编译期,通过kapt处理
@``Dao、@Database注解,动态生成对应的实现类
- 底层使用Android提供的
SupportSQLiteOpenHelper实现数据库的增删改查等操作
kapt注解处理
Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类 AppDatabase --> AppDatabase_Impl UserDao-->UserDao_Impl
实现类利用Android SQLite进行数据库操作
AppDatabase_Impl:数据库实例的具体实现,自动生成,主要有以下几个方法
createOpenHelper()`: `Room.databaseBuilder().build()`创建Database时,会调用实现类的 `createOpenHelper()`创建`SupportSQLiteOpenHelper`,此Helper用来创建DB以及管理版本 `userDao()`:创建`UserDao_Impl
UserDao_Impl: UserDao的具体实现,自动生成,主要有以下3个属性以及UserDao里定义的接口
__db`:`RoomDatabase`的实例 `__insertionAdapterOfUser` :`EntityInsertionAdapterd`实例,用于数据`insert` `__deletionAdapterOfUser`:`EntityDeletionOrUpdateAdapter`实例,用于数据的`update/delete
以下几个是UserDao里我们自己定义的接口
insertAll(): 使用__db开启事务,使用__insertionAdapterOfUser执行插入操作
delete():使用__db开启事务,使用__deletionAdapterOfUser执行删除操作 getAll():使用Cursor循环读取数据库的每条记录,并将结果保存在List<User>中返回 loadAllByIds():和getAll()类似,查询语句不同 findByNames():和getAll()类似,查询语句不同