Android客户端 | 青训营笔记

90 阅读3分钟

Android客户端 | 青训营笔记

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

数据存储

简介

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

2.2 存储方式对比

持久性的本地数据存储是Android中常见的能力,可以在应用被杀死的情况下,而保持数据不会被清除。我们可以根据不同场景的诉求,可以选用不同的存储方式,常见的数据存储主要有以下4种。

image.png

2.3 数据库开源框架对比

数据库 相对来说,其使用会比较复杂些,我们单独进行探索,下面是几个主流的数据库框架对比

image.png

image.png 不同的产品,对功能的诉求不太应用,头条因为也有用到LiveData,同时考虑到是Google出品,其流行度和稳定性都有较好的保障,所以更倾向于使用Room数据库,下面会重点介绍下Room数据库。

Room数据库的使用

Room是 Google Jetpack 家族里的一员,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库

image.png 主要的3个组件

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

image.png

Room接入

Gradle目录的build.gradle文件里添加如下:

image.png

数据表设计

下面假设设计一个表,表名为user,数据表包含uidfirst_name、 last_name 3个字段

image.png

新建Entity

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

image.png

新增DAO

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

image.png

新建数据库类

进行数据库配置,并需满足以下几个条件:

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

image.png

2.4.6 获取dao对象

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

image.png

Room原理介绍

核心

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

kapt注解处理

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

image.png kapt生成的代码在build/generated/source/kapt/

image.png

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

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

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

image.png UserDao_ImplUserDao的具体实现,自动生成,主要有以下3个属性以及UserDao里定义的接口

__dbRoomDatabase的实例 __insertionAdapterOfUserEntityInsertionAdapterd实例,用于数据insert __deletionAdapterOfUserEntityDeletionOrUpdateAdapter实例,用于数据的update/delete

以下几个是UserDao里我们自己定义的接口

insertAll(): 使用__db开启事务,使用__insertionAdapterOfUser执行插入操作

delete():使用__db开启事务,使用__deletionAdapterOfUser执行删除操作 getAll():使用Cursor循环读取数据库的每条记录,并将结果保存在List<User>中返回 loadAllByIds():和getAll()类似,查询语句不同 findByNames():和getAll()类似,查询语句不同

image.png

image.png

image.png

image.png

数据库总结

image.png