快速掌握Room框架,解放Sql操作双手

文章介绍了Room框架,它是Jetpack组件库的一部分,简化了Sqlite操作。通过依赖引入、创建数据表实体类、定义Dao接口以及数据库创建,展示了如何进行数据查询、插入、更新和删除。文章还提到了使用协程进行异步操作,并强调了成为架构师需要的技能和学习资源。
摘要由CSDN通过智能技术生成

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,
)

注解参数描述
@EntitytableName, indices, inheritSuperIndices, primaryKeys标记一个类作为实体,表示数据库中的一个表。
@PrimaryKeyautoGenerate, onConflict指定实体的主键字段。
@ColumnInfoname, typeAffinity, collate指定实体中列的详细信息。
@ForeignKeyentity, parentColumns, childColumns, onDelete, onUpdate指定实体之间的外键约束。
@Indexname, 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 ")
    }
}

最后

如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。

如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
在这里插入图片描述
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。

全套视频资料:

一、面试合集

在这里插入图片描述
二、源码解析合集
在这里插入图片描述

三、开源框架合集
在这里插入图片描述
欢迎大家一键三连支持,若需要文中资料,直接扫描文末CSDN官方认证微信卡片免费领取↓↓↓

PS:群里还设有ChatGPT机器人,可以解答大家在工作上或者是技术上的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值