这是我参与「第四届青训营 」笔记创作活动的第9天
构建Room 数据库
- 我们了解过SQLite数据库就知道,它仅仅是使用了一些原生的API来进行数据的增删改查操作。这些原生API虽然简单易用,但是如果放到大型项目当中的话,会非常容易让项目的代码变得混乱,除非你进行了很好的封装。
- 为此市面上出现了诸多专门为Android数据库设计的ORM框架。
- ORM(Object Relational Mapping)也叫对象关系映射。简单来讲,我们使用的编程语言是面向对象语言,而使用的数据库则是关系型数据库,将面向对象的语言和面向关系的数据库之 间建立一种映射关系,这就是ORM了。
- 那么使用ORM框架有什么好处呢?
- 它赋予了我们一个强大的功能,就是可以用面向对象的思维 来和数据库进行交互,绝大多数情况下不用再和SQL语句打交道了,同时也不用担心操作数据 库的逻辑会让项目的整体代码变得混乱。
- 由于许多大型项目中会用到数据库的功能,为了帮助我们编写出更好的代码,Android官方推出 了一个ORM框架,并将它加入了Jetpack当中,也就是Room。
- Room提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。
Room与其他ORM框架对比有以下优点:
编译期检查,Room会在编译的时候验证每个@Query和@Entity等,它不仅检查语法问题,还会检查是否有该表,这就意味着几乎没有任何运行时错误的风险
Room有3个主要组件:
- Entity : 数据实体,对应数据库中的表。
用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表,并且表中的列是根据实体类中的字段自动生成的。
- Dao :数据访问对象
Dao是数据访问对象的意思,通常会在这里对数据库的各项操作进行封装,在实际编程的时候,逻辑层就不需要和底层数据库打交道了,直接和Dao层进行交互即可。
- Database:数据库持有者
用于定义数据库中的关键信息,包括数据库的版本号、包含哪些实体类以及提供Dao层的访问实例
————————————————
Room的使用
- 首先先在app/build.gradle文件中添加 依赖,同时在dependencies闭包中添加了两个Room的依赖库
- 下面我们就按照刚才介绍的Room的3个组成部分一一来进行实现,首先是定义Entity,也就是实体类。
例如下面这个例子:
@Entity
data class User(var firstName: String, var lastName: String, var age: Int) {
@PrimaryKey(autoGenerate = true)
var id: Long = 0
}
创建表一般会用到下面几个注解:
@Entity(tableName=“表名称”)
定义一个表
@PrimaryKey(autoGenerate=true)
定义主键
@ColumnInfo(name = “列名”)
定义列名
@Ignore
忽略某个字段
- Dao
@Insert、 @Delete、 @Update、 @Query 代表我们常用的插入、删除、更新、查询数据库操作。 - DataBase
接下来我们进入最后一个环节:定义Database。这部分内容的写法是非常固定的,只需要定义 好3个部分的内容:数据库的版本号、包含哪些实体类,以及提供Dao层的访问实例。