1、为什么使用Room
Room 是一个 SQLite 对象映射库。它可用来避免样板代码,还可以轻松地将 SQLite 表数据转换为 Java 对象。Room 提供 SQLite 语句的编译时检查,并且可以返回 RxJava、Flowable 和 LiveData 可观察对象,使用ROOM可以让你更简单,更流畅的操作数据库,使用简单通过注解的方式就能对数据库进行增删改查,Google工程师帮你封装了访问SqlLite的代码,使你的代码性能更高
2、数据库的封装
先来一个图,理清思路再看代码
2.1、LocalRoomRequestManager
接口层实现,类似于网络模块里的API,将操作SqlLite的接口写到这里边
/*
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
**
- 数据库获取标准接口,数据库读取
- 只为 LocalRoomRequestManager 服务
- DB 数据
*/
interface IDatabaseRequest {
fun insertStudents(vararg students: Student)
fun updateStudents(vararg students: Student)
fun deleteStudents(vararg students: Student)
fun deleteAllStudent()
fun queryAllStudent() : List ?
// 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? {
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
/***
- 可变参数,插入数据
*/
@Insert
fun insertStudents(vararg students:Student)
//更新数据
@Update
fun updateStudents(vararg students:Student)
//根据条件删除
@Delete