Room的小试牛刀
一、前言
Android Jetpack 是一个由多个库组成的套件,可帮助开发者遵循最佳做法,减少样板代码并编写可在各种 Android 版本和设备中一致运行的代码,让开发者精力集中编写重要的代码。而这篇文章中的主角Room正好是Jetpack 的重要库之一,Room数据库在这近几年也是Google极力推荐使用的数据库。
说到这个主角,Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备重新连接到网络后,用户发起的所有内容更改都会同步到服务器。
在下面的学习中,我将以Kotlin的开发环境中进行,毕竟要迎合Google大佬官方开发语言的推荐,话不多说,我们直接展开说下这个数据库是怎么使用的。
二、为什么要使用Room
想必原生的Android数据库SQLite打击都不陌生,而本篇文章的主角Room其实就只是对原生的SQLite API进行了一层封装,使得更加流畅的访问数据库。另外它和常规的ORM框架一样,通过添加编译期注解来进行表和字段的配置,其包含了三个主要组件:
1、Databasee:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点;使用 @Database 注释的类应满足以下条件:是扩展 RoomDatabase 的抽象类。在注释中添加与数据库关联的实体列表。包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。
在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。
2、Entity:表示数据库中的表,通过@Entity标识。
3、DAO:包含用于访问数据库的方法,通过@Dao标识。
二、使用步骤
1、添加依赖
Kotlin环境依赖如下:
plugins {
id 'com.android.application'
id 'kotlin-android'
id 'kotlin-kapt'
}
android {
defaultConfig {
...
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas")
}
}
}
}
dependencies {
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
// optional - Test helpers
testImplementation "androidx.room:room-testing:$room_version"
}
2、数据库表Entity的创建
通过@Entity
注解标识实体类,其中tableName
表示明确表名,如果不明确表名数据库指定当前实体作为表名,@PrimaryKey
注解标识主键,是唯一的值,值不能为空,我这里默认指定为0,autoGenerate = true
表示主键自增; @ColumnInfo
注解标识表中列信息,name =
指定列中对应数据库字段名称,不指定时默认为自定义的参数名称:
@Entity(tableName = "student_info")
data class StudentEntity(
@ColumnInfo(name = "stu_name")
val name: String?,
@ColumnInfo(name = "stu_sex")
val sex: String?,
@ColumnInfo(name = "stu_skill")
val skill:String?,
@PrimaryKey(autoGenerate = true)
val id: Long = 0
)
3、数据库Database的创建
创建数据库需要继承RoomDatabase的抽象类,并且通过@Database
标识这个类,@Database
中里面有几个参数可以展开说一下,entities
表示要添加进来的数据库表,这里是以数组的形式添加,后续有多个表可以用逗号隔开添加进来,version
表示这个数据库的版本,版本迁移时会使用到,exportSchema
表示导出为文件模式,默认为true,除了添加表映射的类以及和数据库版本外,还要添加exportSchema = false否则会报警告。这个类里面还定义了获取增删改查操作接口的方法StudentDAO,下面还涉及了版本迁移的方法,当数据库表Entity中某些字段增加或减少就需要调用数据库迁移的方法,此外,打比方原来的版本(version)是1,就要改成2,下一次字段变更时,版本以此类推的增加。想要保留数据的情况下做版本迁移就需要调用addMigrations()
方法,这个非常重要。
@Database(entities = [StudentEntity::class], version = 3, exportSchema = false)
abstract class StudentDB : RoomDatabase() {
abstract fun getStudentDao(): StudentDAO
companion object {
//版本迁移:2->3(这个是增加字段下的迁移)
private val MIGRATION_2_3