提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、前言
- 二、Room 主要组件
- 三、Room 基础入门
- 3.1 引入 Room 库到项目
- 3.2 Room 使用示例
- 3.2.1 定义数据实体类
- 3.3.2 定义数据访问对象(DAO)
- 3.3.3 定义数据库类
- 3.3.4 创建数据库实例
- 3.3.5 从数据库实例中获取数据访问对象(DAO)实例
- 3.3.6 通过数据访问对象(DAO)实例操作数据库
- 总结
- 郭海城
- https://blog.csdn.net/weixin_53644402/article/details/128195736
一、前言
Room 是 Android Jetpack 的一部分。在 Android 中数据库是SQLite数据库,Room 就是在SQLite上面提供了一个抽象层,通过 Room 既能流畅地访问数据库,又能充分展示 SQLite 数据库的强大功能。Room 主要有以下几大优点:
1.在编译时校验 SQL 语句;
2.易用的注解减少重复和易错的模板代码;
3.简化的数据库迁移路径。
正是 Room 有以上的优点,所以建议使用 Room 访问数据库。
提示:以下是本篇文章正文内容,下面案例可供参考
二、Room 主要组件
Room 主要组件有三个:
1.数据库类(RoomDatabase):拥有数据库,并作为应用底层持久性数据的主要访问接入点。
2.数据实体类(Entity):表示应用数据库中的表。
3.数据访问对象(DAO):提供方法使得应用能够在数据库中查询、更新、插入以及删除数据。
应用从数据库类获取一个与之相关联的数据访问对象(DAO)。应用可以通过这个数据访问对象(DAO)在数据库中检索数据,并以相关联的数据实体对象呈现结果;应用也可以使用对的数据实体类对象,更新数据库对应表中的行(或者插入新行)。应用对数据库的操作完全通过 Room 这个抽象层实现,无需直接操作 SQLite数据库。下图就是 Room 各个组件之间的关系图:
三、Room 基础入门
大致了解了 Room 的工作原理之后,下面我们就来介绍一下 Room 的使用入门。
3.1 引入 Room 库到项目
引入 Room 库到项目,在项目程序模块下的 build.gradle 文件的dependencies
// Kotlin 开发环境,需要引入 kotlin-kapt 插件
apply plugin: 'kotlin-kapt'
// .........
dependencies {
// other dependecies
def room_version = "2.3.0"
implementation("androidx.room:room-runtime:$room_version")
// 使用 Kotlin 注解处理工具(kapt,如果项目使用Kotlin语言开发,这个必须引入,并且需要引入 kotlin-kapt 插件
kapt("androidx.room:room-compiler:$room_version")
// To use Kotlin Symbolic Processing (KSP)
// ksp("androidx.room:room-compiler:$room_version")
// 可选 - 为 Room 添加 Kotlin 扩展和协程支持
implementation("androidx.room:room-ktx:$room_version")
// 可选 - 为 Room 添加 RxJava2 支持
implementation "androidx.room:room-rxjava2:$room_version"
// 可选 - 为 Room 添加 RxJava3 支持
implementation "androidx.room:room-rxjava3:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "androidx.room:room-guava:$room_version"
// optional - Test helpers
testImplementation("androidx.room:room-testing:$room_version")
}
3.2 Room 使用示例
使用 Room 访问数据库,需要首先定义 Room 的三个组件,然后通过数据访问对象实例访问数据。
3.2.1 定义数据实体类
数据实体类对应数据库中的表,实体类的字段对应表中的列。定义 Room 数据实体类,使用 data class 关键字,并使用 @Entity 注解标注。
@Entity
class User(@PrimaryKey val uid: Int, @ColumnInfo() val name: String, @ColumnInfo val age: Int)
3.3.2 定义数据访问对象(DAO)
数据访问对象是访问数据库的桥梁,通过 DAO 访问数据,查询或者更新数据库中的数据(数据实体类是媒介)。数据访问对象(DAO)是一个接口,定义时添加 @Dao 注解标注,接口中的每一个成员方法表示一个操作,成员方法使用注解标示操作类型。更多关于数据访问对象(DAO)和数据操作类型注解。以下是简单的 DAO 示例代码:
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE name LIKE :name")
fun findByName(name: String): List<User>
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
3.3.3 定义数据库类
数据库是存储数据的地方,使用 Room 定义数据库时,声明一个抽象类(abstract class),并用 @Database 注解标示,在 @Database 注解中使用 entities 参数指定数据库关联的数据实体类列表,使用 version 参数指定数据的版本。数据库类中包含获取数据访问实体类对象的抽象方法。
3.3.4 创建数据库实例
定义好数据实体类、数据访问对象(DAO)和数据类之后,便可以创建数据库实例。使用 Room.databaseBuilder().build() 创建一个数据库实体类,Room 会根据定义的数据实体类、数据库访问对象和数据库类,以及他们定义时指定的对应关系,自动创建数据库和对应的表关系。如以下示例代码所示:
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "app_db").build()
3.3.5 从数据库实例中获取数据访问对象(DAO)实例
在定义数据库类时,将数据访问对象(DAO)类与之相关联,定义抽象方法返回对应的数据库访问对象(DAO)实例。在数据库实例化过程中,Room 会自动生成对应的数据访问对象(DAO),只需要调用定义数据库类时定义的抽象方法,即可获取对应的数据访问对象(DAO)实例。如下示例所示:
val userDao = db.userDao();
3.3.6 通过数据访问对象(DAO)实例操作数据库
获取到数据访问对象(DAO)实例,就可以调用数据库访问对象(DAO)类中定义的方法操作数据库了。如下示例所示:
Thread {
// 插入数据
userDao.insertAll(
User(1, "Student1", 18),
User(2, "Student2", 18),
User(3, "Student3", 17),
User(4, "Student4", 19)
)
// 查询数据
val result = userDao.getAll()
result.forEach {
println("Student: id = ${it.uid}, name = ${it.name}, age = ${it.age}")
}
}.start()
总结
Room 是非常强大易用的,可以减少数据库操作过程中的出错,因为所有的 SQL 语句都在编译是进行检查,如果存在错误,将会在编译时就显示错误信息。不仅如此,Room 还非常优秀地处理了多进程很多线程访问数据库的问题。下面是关于 Room 使用的进阶博文:
Android Room 数据实体类详解
Android Room 数据访问对象(DAO)详解
Android Room 数据库详解
在 Room 数据库中创建视图
使用单元测试测试您的 Room 数据库