前言
对于需要处理大量结构化数据的 App 来说,把这些数据做本地持久化会带来很大的好处。常见的用例是缓存重要数据块。这样当设备无法连网的时候,用户仍然可以浏览内容。而用户对内容做出的任何改动都在网络恢复的时候同步到服务端。
那么 Room 又作为 Jetpack 包的一部分,所以我们就必须要掌握其内容;下面让我们看看如何使用
首先,我们先讲下开发中常用的一些数据库知识
数据库的4个基本知识介绍
数据(Data)
数据是数据库中存储的对象。描述事物的符号记录称为数据。数据和关于数据的解释是不可分的。数据的解释是指对数据含义的说明,数据的含义称为数据的语义,数据与其语义是不可分的。
数据库(DataBase,DB)
数据库是长期存储在计算机内、有组织、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述、存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。数据库中的数据具有永久存储、有组织和可共享三个基本特点。
数据库管理系统(DataBase Management System,DBMS)
数据库管理系统在数据库建立、运用和维护时对数据库进行统一控制,以保证数据的完整性和安全性,并在多用户同时使用数据库时进行并发控制,在发生故障后对数据库进行恢复。
数据库管理系统是位于用户和操作系统之间的一层数据管理软件。用于科学的组织和存储数据,高效的获取和维护数据。主要功能:
- 数据定义功能(数据定义语言,DDL)
- 数据组织、存储和管理
- 数据操纵功能(数据操纵语言,DML)
- 数据库的事务管理和运行管理
- 数据库的建立和维护
- 其他功能
数据库系统(DataBase System,DBS)
数据库系统是由数据库、数据库管理系统、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据的系统。
Room 框架
Room 持久性库在 SQLite 的基础上提供了一个抽象层,让用户能够在充分利用 SQLite 的强大功能的同时,获享更强健的数据库访问机制。Room框架由 Google 官方维护。进行数据库操作时,官方推荐使用 Room。
Room主要由三个部分组成,使用注解标识数据库操作。具体操作 SQL 的代码可以不用写,编译时自动生成:
-
数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。使用
@Database注解标识。一个类在使用@Database注解时,应当注意以下三点:- 是 RoomDatabase 抽象类的子类。
- 在注解中添加与数据库关联的实体列表(Entity,标识数据库中的表)。
- 包含抽象方法,该抽象方法具有 0 个参数,且返回使用
@Dao注解的类。
在运行时,可以通过调用 Room.databaseBuilder()或 Room.inMemoryDatabaseBuilder() 获取Database实例对象。
-
Entity:表示数据库中的表。使用
@Entity标识 -
DAO:包含用于访问数据库的方法。使用
@DAO标识- @Insert:插入操作
- @Delete:删除操作
- @Update:更新操作
- @Query:查询操作
下面是一张官方的说明图,说明上面三个组件之间的关系
我们先来举一个简单的例子,讲讲 Room 框架如何使用。假设我们要存储一次打卡记录。打卡记录以时间戳存储。通常的时间戳,我们会精确到毫秒。但这可能是不够的。因为存在机器打卡的情况,所以需要更加精确的时间戳。Java 8 的新版时间 API 就采用了 秒 + 秒内纳秒 的形式。一个 CPU 指令执行的最小时间也得几十纳秒。所以精确到纳秒是绰绰有余的。
对于类型的选择,我们知道,Java 中,int 是用 4 个字节表示,最大值为 2147483647 (2^31-1,21亿多),而 1 秒等于 10 亿纳秒(1 * 1000(毫秒) * 1000(微秒) * 1000(纳秒)),所以用 int 来存储纳秒是可行的。
Room 框架特性
Room 框架中数据库的匹配是以主键进行匹配的,包括增、删、改,其返回结果也是数据项的主键。查询操作可以不用主键匹配,但得自定义 SQL 语句
下面是 Room 中用到的一些常用注解的总结:
- @Database:数据库类的标识,使用
entities属性标记数据库中的表,使用version属性标识数据库版本 - @Entity:数据库表的标识,使用
tableName指定数据表的名称,使用primaryKeys指定数据表中的联合主键 - @PrimaryKey:数据表中主键字段的标识
- @ColumnInfo:数据表中字段的标识,使用
name指定字段名称 - @Ignore:当某个字段或者方法不想映射到数据表中时,可以使用此注解,取消映射关系
- @Dao:Dao 操作类的标识注解
- @Insert:数据表数据插入操作的标识,使用
onConflict属性指定插入冲突时的策略,策略存在OnConflictStrategy类中 - @Delete:数据表数据删除操作的标识
- @Query:数据表数据查询操作的标识。查询时需要输入 SQL 语句,":"用于充当模版字符串的标识
- @Update:数据表数据更新操作的标识
- @Embedded:可以在数据库中使用内嵌对象
Room 默认生成的Dao实现类代码是线程安全的,如不放心,可自己调用数据库的事务操作,保证线程安全
Room 框架入门基本概念就到这里了,更多 Android Jetpack 相关的技术知识文档:可在评论区下方留言或者私信发送 "进阶" 即可 免费获取
好了,以上就是今天要分享的内容,大家觉得有用的话,可以点赞分享一下;如果文章中有什么问题欢迎大家指正;欢迎在评论区或后台讨论哈~