Kotlin实战---使用Room封装本地数据层(1),开发这么久这些问题都不会

1、为什么使用Room

Room 是一个 SQLite 对象映射库。它可用来避免样板代码,还可以轻松地将 SQLite 表数据转换为 Java 对象。Room 提供 SQLite 语句的编译时检查,并且可以返回 RxJava、Flowable 和 LiveData 可观察对象,使用ROOM可以让你更简单,更流畅的操作数据库,使用简单通过注解的方式就能对数据库进行增删改查,Google工程师帮你封装了访问SqlLite的代码,使你的代码性能更高

2、数据库的封装

先来一个图,理清思路再看代码

在这里插入图片描述

2.1、LocalRoomRequestManager

接口层实现,类似于网络模块里的API,将操作SqlLite的接口写到这里边

/***
 * 数据库获取标准接口,数据库读取
 * 只为 LocalRoomRequestManager 服务
 * DB 数据
 */
interface IDatabaseRequest {
    fun insertStudents(vararg students: Student)

    fun updateStudents(vararg students: Student)

    fun deleteStudents(vararg students: Student)

    fun deleteAllStudent()

    fun queryAllStudent() : List<Student> ?

    // TODO 可扩展 ...
}

/**
 * 为了扩展,这样写(在仓库里面的)
 * 本地获取标准接口(在仓库里面) 也就是本地的数据读取(包括本地xml数据,等)
 * 只为 LocalRoomRequestManager 服务
 *
 * xml 数据  本地数据
 */
interface ILocalRequest {
} 

LocalRoomRequestManager类的实现,初始化的通过dataBase层获取dao,然后通过dao层进行增删改查

class LocalRoomRequestManager :ILocalRequest,IDatabaseRequest{
    var studentDao:StudentDao?=null
    //相当于Java代码的构造代码块
    init{
        val  studentDatabase=StudentDatabase.getDataBase()
        studentDao=studentDatabase?.getStudentDao()
    }
    companion object{
        var INSTANCE: LocalRoomRequestManager? = null

        fun getInstance() : LocalRoomRequestManager {
            if (INSTANCE == null) {
                synchronized(LocalRoomRequestManager::class) {
                    if (INSTANCE == null) {
                        INSTANCE = LocalRoomRequestManager()
                    }
                }
            }
            return INSTANCE!!
        }
    }
    override fun updateStudents(vararg students: Student) {
        studentDao?.updateStudents(*students)
    }

    override fun deleteStudents(vararg students: Student) {
       studentDao?.deleteStudent(*students)
    }

    override fun deleteAllStudent() {
        studentDao?.deleteAllStudent()
    }

    override fun queryAllStudent(): List<Student>? {
        return  studentDao?.queryAllStudents()
    }

    override fun insertStudents(vararg students: Student) {
        studentDao?.insertStudents(*students)
    }

} 

2.2、Room操作

真正用来操作数据库的代码

初始化数据库

@Database(entities = [Student::class],version = 1)
abstract  class StudentDatabase: RoomDatabase() {
    abstract fun getStudentDao():StudentDao

    companion object{
        private  var INSTANCE:StudentDatabase?=null
        //Application 调用
        fun getDatabase(context: Context):StudentDatabase?{
                if(INSTANCE==null){
                    INSTANCE=Room.databaseBuilder(context,StudentDatabase::class.java,"student_database.db")
                        .allowMainThreadQueries()//允许在主线程查询
                        .build()
                }
            return INSTANCE
        }
        //使用者调用
        fun getDataBase():StudentDatabase?= INSTANCE
    }

} 

在Application里去初始化database

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()

        // 初始化
        StudentDatabase.getDatabase(this)
    }

} 

Room.databaseBuilde 就是实例化的DataBase的实现类 实现类里的代码: 在这里插入图片描述 这些都是框架生成的代码,省去了我们许多的样板代码 Dao层和Entity实现

@Dao
interface StudentDao {
    /***
     * 可变参数,插入数据
     */
    @Insert
    fun insertStudents(vararg students:Student)
    //更新数据
    @Update
    fun updateStudents(vararg  students:Student)

    //根据条件删除
    @Delete
    fun deleteStudent(vararg students:Student)
    //删除全部
    @Query("delete from student")
    fun  deleteAllStudent()
    //查询全部
### 最后

**要想成为高级安卓工程师,必须掌握许多基础的知识。**在工作中,这些原理可以极大的帮助我们理解技术,在面试中,更是可以帮助我们应对大厂面试官的刁难。

* * *

![](https://img-blog.csdnimg.cn/img_convert/09968396f9b765f16ac603d0449a5d1d.png)

![](https://img-blog.csdnimg.cn/img_convert/d22a4382e339a7824f9c77be5146c227.png)

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)**
630580380887)]

[外链图片转存中...(img-2PanDq6L-1630580380888)]

**[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://codechina.csdn.net/m0_60958482/android_p7)**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值