快速掌握Room框架,解放Sql操作双手
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
转载自:https://juejin.cn/post/7237425805511786552