Jetpack架构组件Room-基本使用

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的基本使用就已经完成了

上一篇:Uncaught SyntaxError: Unexpected token o in JSON at position 1


下一篇:天高任鸟飞,在你还苦闷Android出路时,总有人在系统钻研为高级开发做准备,技能提升的重要性不用我说了!