Android Jetpack架构组件 — Room
基础使用
使用环境
androidx、kotlin
注入依赖
def room_version = "2.2.6"
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"
// optional - Kotlin扩展和协同程序对Room的支持
implementation "androidx.room:room-ktx:$room_version"
注意:需要引用kapt插件
建立实体类表
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
/**
* 作者: CQ
* 日期: 2021-05-13
* 说明: 老师
*/
@Entity(tableName = "Teacher")
class Teacher(
@PrimaryKey(autoGenerate = true)
var id: Int?, // id
@ColumnInfo(name = "name", defaultValue = "什么人", typeAffinity = ColumnInfo.TEXT)
var name: String?, //姓名
@ColumnInfo(name = "sex")
var sex: String, //性别
@Ignore
var type: String //科目类别
) {
constructor(id: Int?, name: String, sex: String) : this(id, name, sex, "") // 新增一个构造方法,方便使用
override fun toString(): String { // 方便打印
return "Teacher(id=$id, name=$name, sex='$sex', type='$type')"
}
}
重要概念
- @Entity(tableName = “Teacher”)
- @Entity:标注实体类,对应的是数据库的一张表结构,需要使用注解 @Entity 标记
- tableName:表名(一般可以不用,默认表名=实体类名)
- @PrimaryKey(autoGenerate = true)
- @PrimaryKey:主键, @PrimaryKey标注表的主键(主键为int、long类型时,最小值为1而不是0)
- autoGenerate:使用autoGenerate = true 来指定了主键自增长。(可以不用,默认为false)
- @ColumnInfo(name = “name”, defaultValue = “什么人”, typeAffinity = ColumnInfo.TEXT)
- @ColumnInfo:@ColumnInfo注解用来标注表对应的列的信息比如表名
- name:表字段名称(一般可以不用,默认字段名=变量名)
- defaultValue:默认值(一般可以不用,用处不是特别大)
- typeAffinity:默认字段输入类型(一般可以不用)
- @Ignore:标注后,当前变量将不会在数据库中生成对应的字段
定义操作数据库的方法
/**
* 作者: CQ
* 日期: 2021-05-13
* 说明:其中定义一系列的操作数据库的方法。
*/
@Dao
interface TeacherDao {
// 插入数据
@Insert
fun insertTeacher(teacher: Teacher)
// 插入数据(如果键值相同,则覆盖)
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun replaceTeacher(teacher: Teacher)
// 查询(SQL 语句)
@Query("select * from Teacher")
fun queryTeacher() : List<Teacher>
// 删除:主要根据teacher.id
@Delete
fun deleteTeacher(teacher: Teacher)
// 删除:虽然是查询的注解,单实际上是根据id做删除操作
@Query("delete from Teacher where id=:id")
fun deleteTeacher(id : Int)
// 更新
@Update
fun updateTeacher(teacher: Teacher)
}
@Dao:Dao类是一个 interface,其中定义了一系列的操作数据库的方法
@query:查询注解
@Insert:插入注解
@Delete:删除注解
@Update:更新注解
定义一个抽象类继承RoomDatabase类
/**
* 作者: CQ
* 日期: 2021-05-13
* 说明: 继承RoomDatabase类
*/
@Database(entities = [Teacher::class], version = 1, exportSchema = false)
abstract class AppDataRoom : RoomDatabase() {
// 定义一个操作类
abstract fun teacherDao(): TeacherDao
companion object {
// 使用单例模式
private var instance: AppDataRoom? = null
fun getInstance(context: Context): AppDataRoom {
return instance ?: synchronized(this) {
instance ?: buildDataBase(context)
}
}
private fun buildDataBase(context: Context): AppDataRoom {
return Room
.databaseBuilder(context, AppDataRoom::class.java, "room") // room:数据库名称
.allowMainThreadQueries() // 允许在主线程中操作,如果不加的话,只能在子线程中调用
.build()
}
}
}
- @Database(entities = [Teacher::class], version = 1, exportSchema = false)
- @Database:标识类
- entities:表示表对应的实体类
- version:版本号
使用
val teacherDao = AppDataRoom.getInstance(this).teacherDao()
teacherDao.replaceTeacher(Teacher(1, "陈主任", "男"))
teacherDao.replaceTeacher(Teacher(2, "张老师", "男", "数学"))
teacherDao.replaceTeacher(Teacher(3, "于老师", "女", "英语"))
teacherDao.queryTeacher().forEach {
Log.e("TAG", "onInit: $it")
}
打印结果:
E/TAG: onInit: Teacher(id=1, name=陈主任, sex='男', type='')
E/TAG: onInit: Teacher(id=2, name=张老师, sex='男', type='')
E/TAG: onInit: Teacher(id=3, name=于老师, sex='女', type='')
到这里,room的基本使用就已经完成了