Room结构快速把握运用

1.介绍

Room结构是Jetpack组件库中的的一个轻量快速用于Sqlite操作的结构,能够快速根据表对应的实体类来生成数据表,能够快速进行Sql查询和MyBatis的运用迥然不同,而且Room结构对数据库的简略更新能够主动识别替换,无需人为写Sql句子,Room结构也拥有高效率的查询处理方式,它会把数据在内存中进行增删改查操作,对比原始的直接对文件进行操作效率大大的添加

2.依靠引进

引进Room结构依靠

implementation 'androidx.room:room-runtime:2.4.2'
implementation "androidx.room:room-ktx:2.4.2"
// 加上Kapt依靠,也能够换成KSP 首要的作用是供给主动生成数据表的操作
kapt"androidx.room:room-compiler:2.5.1"
//参加kapt依靠后要运用kapt的插件
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    //启用Kapt插件
    id 'kotlin-kapt'
}

3.创立对应数据表

//识别这个类为数据表对应的实体类界说
@Entity(tableName = "user") //设置表名
data class UserEntity(
    //设置主键和主动添加
    @PrimaryKey(autoGenerate = true)
    var id: Int?=null,
    //设置为字段,不写name默认用特点名作为字段名
    @ColumnInfo(name = "account")
    var act: String,
    @ColumnInfo
    var nickname: String,
)
注解 参数 描绘
@Entity tableName, indices, inheritSuperIndices, primaryKeys 符号一个类作为实体,表示数据库中的一个表。
@PrimaryKey autoGenerate, onConflict 指定实体的主键字段。
@ColumnInfo name, typeAffinity, collate 指定实体中列的详细信息。
@ForeignKey entity, parentColumns, childColumns, onDelete, onUpdate 指定实体之间的外键约束。
@Index name, value, unique, onCreate, onDrop 为表中一个或多个列创立索引。

4.创立Dao操作

// 运用 @Dao 注解标识这个接口作为数据访问目标(Dao)
@Dao
interface UserDao {
    // 运用 @Query 注解进行查询,查询一切用户对应的实体类数据
    @Query("SELECT * FROM user")
    fun getAll(): List<UserEntity>
    // 运用 @Insert 注解插入新的用户实体目标数据
    @Insert
    fun insertUser(userEntity: UserEntity)
    // 运用 @Query 注解进行查询,通过 account 参数查询对应的用户实体目标数据,留意运用:来运用你的参数
    @Query("SELECT * FROM user WHERE account = :account")
    fun getInfoByAct(account: String): List<UserEntity>
}
注解 功用 示例
@Query 履行 SQL 查询句子 @Query("SELECT * FROM user WHERE age > :minAge") fun getUsersOlderThan(minAge: Int): List<User>
@Insert 将一个或多个实体目标插入到数据库中 @Insert fun insertUser(user: UserEntity)
@Update 更新一个或多个实体目标 @Update fun updateUser(user: UserEntity)
@Delete 删除一个或多个实体目标 @Delete fun deleteUser(user: UserEntity)

5.界说数据库创立

// 运用 @Database 标签将此类符号为一个 Room 数据库操作类
@Database(
    version = 1, // 指定数据库的版本号
    entities = [UserEntity::class], // 设置数据库中所包括的实体目标类
    exportSchema = false // 是否导出数据库的形式信息
)
abstract class MyDataBase:RoomDatabase(){
    companion object{
        // 初始化 MyDataBase 目标为 null
        private var db:MyDataBase?=null
        private val name="app" // 数据库名称
        // 创立或获取数据库目标的办法
        fun getDB(context: Context)=if (db==null){
            // 运用 Room.databaseBuilder 建立数据库目标
            Room.databaseBuilder(context, MyDataBase::class.java, name)
            		//实现多个db目标的数据缓存同步
                    .enableMultiInstanceInvalidation()
                    .build()
                    .apply {
                        db=this // 将数据库目标赋给 MyDataBase 类的 db 特点
                    }
        } else {
            db!! // 假如数据库目标现已存在,直接回来该目标
        }
    }
    // 抽象办法 getUserDao,用于将数据访问目标(Dao)与此数据库操作类相关
    abstract fun getUserDao():UserDao
}
参数 功用
version 指定数据库的版本号,在数据表结构更新的时分写新的版本
entities 指定实体目标类。这些类会以表的方式存储在数据库中
exportSchema 是否导出数据库的形式信息。假如设置为 true,则会在 build 目录下生成一个 XML 文件,用于展现数据库的形式信息
autoMigrations 主动跟新你修改后的表格,假如修改比较复杂需要手动写sql

导出主张设置为false 默以为true 要不然不写导出配置会编译报错

6.运用

// 获取 MyDataBase 数据库目标,并获取 UserDao 数据访问目标
val userDao = MyDataBase.getDB(requireContext()).getUserDao()
// 开启一个协程作用域,运用 IO 线程池履行后续操作
CoroutineScope(Dispatchers.IO).launch {
    // 从 UserDao 中获取一切的 UserEntity 目标,并逐一遍历输出
    userDao.getAll().forEach {
        Log.e("TAG", "all$it ")
    }
}

结尾

欢迎加群沟通一起评论计算机相关知识:QQ群259352297

这个文档对应的B站的视频教程:20分钟把握Room结构,解放双手_哔哩哔哩_bilibili