数据存储 | 青训营笔记

75 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第9天

数据存储

简介

  • 数据存储的方式有很多种,其使用场景也不一样,本文主要介绍其中4种最为常见的数据存储方式和使用场景
  • 数据库是4种常见数据存储方式中较为复杂的能力,本文也会重点介绍

存储方式对比

常见的数据存储主要有四种: img

数据库开源框架对比

主流数据库开源框架对比img

Room数据库的使用

img

主要有三个组件:

  • 数据库类,用于保存数据库并作为应用持久性数据底层链接的主要访问点
  • 数据实体,用于表示应用的数据库的表
  • 数据访问对象,提供应用的可用查询、更新、插入和删除数据库中的数据的方法

img

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,数据表包含uidfirst_namelast_name 3个字段

img

新建Entity

定义一个User数据实体,User的每个实例都代表App数据库中的user表的一行

img

新增DAO

定义一个名为UserDao的DAO。用来对User表的增删改查img

新建数据库类

  • 新增一个RoomDatabaseabstract子类
  • 子类需加注解@Database(entities = [xxx], version = n)entities包含数据实体,将会在这个数据库中创建对应的表,version是数据的版本号
  • 对于与数据库关联的每个DAO类,数据库类必须定义一个无参的抽象方法,并返回DAO类实例

img

获取dao对象

可进行数据库的增删改查操作

img

Room原理介绍

核心

  • 编译期,通过kapt处理@``Dao@Database注解,动态生成对应的实现类
  • 底层使用Android提供的SupportSQLiteOpenHelper实现数据库的增删改查等操作

kapt注解处理

Room在编译期,通过kapt处理@Dao和@Database注解,生成DAO和Database的实现类 AppDatabase --> AppDatabase_Impl UserDao-->UserDao_Impl

img

img

实现类利用Android SQLite进行数据库操作

AppDatabase_Impl:数据库实例的具体实现,自动生成,主要有以下几个方法

 createOpenHelper()`: `Room.databaseBuilder().build()`创建Database时,会调用实现类的 `createOpenHelper()`创建`SupportSQLiteOpenHelper`,此Helper用来创建DB以及管理版本 `userDao()`:创建`UserDao_Impl

img

UserDao_ImplUserDao的具体实现,自动生成,主要有以下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()类似,查询语句不同

imgimgimgimg

数据库总结