Jetpack Room使用

简介: Jetpack Room使用

Room使用

回顾

数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问

注解说明:

@Enity 作用于Class上,表示创建一张表记录该Class,Class内部属性使用@ColumnInfo声明该列名字和Type

@Dao 作用于Interface,该interface主要是提供访问表进行增删改查的接口。使用对应增删改查注解标识方法

@Database 声明数据库(需为abstract),该注解属性entities需声明该数据库中的所有表,version表示该数据库的版本,数据库中声明返回Dao实例的方法

使用流程

通过Room的静态方法databaseBuilder传入context,数据库的class对象,数据库的名称(db结尾)调用build函数就创建了数据库

数据类:

@Entity(tableName = "student")
data class StudentBean(
    @PrimaryKey(autoGenerate = true) var id: Int =0,
    @ColumnInfo(name = "name", typeAffinity = ColumnInfo.TEXT) var name: String,
    @ColumnInfo(name = "age", typeAffinity = ColumnInfo.TEXT) var age: String,
    @ColumnInfo(name = "sex", typeAffinity = ColumnInfo.TEXT) var sex: String
)

Dao:

@Dao
interface StudentDao {
    @Insert
    fun insertStudent(student: StudentBean)
    @Delete
    fun deleteStudent(student: StudentBean)
    @Update
    fun updateStudent(student: StudentBean)
    @Query("select * from student")
    fun getStudentList():List<StudentBean>
    @Query("select * from student where id=:id")
    fun getStudentById(id:Int):List<StudentBean>
}
//声明
@Database(entities = [StudentBean::class],version = 2)
abstract class MyDataBase : RoomDatabase() {
     companion object{
         private const val DATABASE_NAME="my_db"
         private var instance:MyDataBase?=null
       fun getInstance(context:Context):MyDataBase{
           instance?.let {
               return it
           }
           //创建Room数据库需要三个参数:1.上下文context,2.数据库Class  3.数据库名字db结尾
           //会通过反射创建数据库ClassImpl的实例  数据库Class名字和数据库名称
           //build方法会反射创建M有MyDataBaseImpl类并调用该类的init方法
           return Room.databaseBuilder(context.applicationContext,MyDataBase::class.java,
               DATABASE_NAME)
               .addCallback(object : Callback() {
                   override fun onCreate(db: SupportSQLiteDatabase) {
                       super.onCreate(db)
                       Log.i("wwwwwwwwwwwwwww", "RoomDataBaseonCreate: ")
                   }
                   override fun onOpen(db: SupportSQLiteDatabase) {
                       super.onOpen(db)
                       Log.i("wwwwwwwwwwwwwww", "RoomDataBaseoonOpen ")
                   }
                   override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
                       super.onDestructiveMigration(db)
                       Log.i("wwwwwwwwwwwwwww", "数据库被破坏 ")
                   }
               }).addMigrations(object : Migration(1,2) {
                   override fun migrate(database: SupportSQLiteDatabase) {
                       database.execSQL("ALTER TABLE student "
                               + " ADD COLUMN sex TEXT NOT NULL DEFAULT '女'")
                   }
               })
               .build()
       }
    }
    abstract fun getStudentDao():StudentDao

借助build的返回值访问Dao,进行增删改查操作

2.降序升序:在databaseBuilder函数后添加迁移策略addMigrations,构造函数的两个版本对应迁移的版本,migrate函数是匹配对应策略后进行的操作

大致原理

疑问:Dao中只是定义了访问数据库的接口,数据库也只是个抽象类返回Dao实例的接口还没有实现?

在编译期间借助KAPT插件生成@Database标记的实现类,类名只是添加了一个后缀_Impl,而@Dao也会生成对应的_Impl后缀的实现类

查看Dao的实现类发现其每一个crud都是一个事物,并且在uiThread操作会crash,如果需要多个操作按顺序进行而不是单个事务一样,需要添加@Transition标记方法,内部curd将按顺序执行

这两个生成的类可以在该目录下找到build/generated/source/kapt/debug/com/example/myapplication/room

1、databaseBuilder会创建RoomDatabase的Builder对象保存传入的参数(比如数据库的class,数据库名称,版本迁移策略,数据库打开关闭回调),初始化一些的配置参数

build中会反射创建出数据库class+_Impl的实例,然后返回。

2.获取dao之后进行curd,在crud内部首先看有没有挂起的事务,如果Thread 1提交的事务还没有结束,Thread2提交后会报crash(ThreadLocal保证)

3.接着打开数据库,也就是在进行crud的时候才会打开数据库。其中会判断是否进行迁移

4.cud的每个操作验证完23后,就会开启一个事务.beginTransaction()接着设置事务的成功或Fail。最后结束事务


目录
相关文章
|
安全 API Android开发
Jetpack架构组件库-Jetpack入门介绍
Jetpack架构组件库-Jetpack入门介绍
147 0
|
存储 XML 安全
Jetpack DataStore 你总要了解一下吧?
一、DataStore 介绍 DataStore 是 Android Jetpack 中的一个组件,它是一个数据存储的解决方案,跟 SharedPreferences 一样,采用key-value形式存储。 DataStore 保证原子性,一致性,隔离性,持久性。尤其是,它解决了 SharedPreferences API 的设计缺陷。 Jetpack DataStore 是经过改进的新版数据存储解决方案,旨在取代 SharedPreferences,让应用能够以异步、事务方式存储数据。
1001 0
Jetpack DataStore 你总要了解一下吧?
|
4月前
|
XML 存储 API
Jetpack初尝试 NavController,LiveData,DataBing,ViewModel,Paging
Jetpack初尝试 NavController,LiveData,DataBing,ViewModel,Paging
|
5月前
深入了解 Jetpack Compose 中的 Modifier
深入了解 Jetpack Compose 中的 Modifier
100 0
|
XML JSON Java
Jetpack 系列之Paging3,看这一篇就够了~
Jetpack 系列之Paging3,看这一篇就够了~
3167 4
Jetpack 系列之Paging3,看这一篇就够了~
|
Java API 开发工具
Jetpack 之 LifeCycle 组件使用详解
LifeCycle 是一个可以感知宿主生命周期变化的组件。常见的宿主包括 Activity/Fragment、Service 和 Application。LifeCycle 会持有宿主的生命周期状态的信息,当宿主生命周期发生变化时,会通知监听宿主的观察者。
122 0
Jetpack 之 LifeCycle 组件使用详解
|
存储 XML 安全
Android Jetpack系列之DataStore
`Jetpack DataStore` 是一种改进的新数据存储解决方案,允许使用**协议缓冲区**存储键值对或类型化对象。`DataStore` **以异步、一致的事务方式存储数据,克服了 SharedPreferences(以下统称为SP)的一些缺点**。`DataStore`基于`Kotlin`协程和`Flow`实现,并且可以对`SP`数据进行迁移,旨在取代`SP`
549 0
|
SQL 数据库 开发者
Jetpack初识
Google为了开发者更好的设计软件的代码架构以及写出高质量的代码,推出Jetpack组件,将许多好用的代码进行封装,总之使用Jetpack可以使得我们利用更少的时间开发出更高质量的软件
110 0
|
存储 安全 API
Jetpack之DataStore使用
前言DataStore提供了一种安全且持久的方式来存储少量数据。它不支持部分更新:如果任何字段被修改,整个对象将被序列化并持久到磁盘。它是线程安全的,非阻塞的。特别是,它解决了SharedPreferences这些设计缺陷:同步API鼓励违反StrictModeapply和commit没有发出错误信号的机制apply将阻塞fsync上的UI线程不持久-它可以返回尚未持久的状态没有一致性或事务语义在
280 0
Jetpack之DataStore使用
|
存储 安全
Jetpack之DataStore解析
前言在正式讲解DataStore之前,我们先回顾下大家熟知的SharedPreferences(以下简称SP),众所周知SP有一些缺点,如调用getXXX()获取数据,可能会阻塞主线程;无法保证类型安全;加载的数据会一直留在内存中,浪费内存;apply方法无法获取到操作成功或失败的结果。SharedPreferences回顾getXXX()可能会阻塞主线程请看以下SP获取value值的使用代码: 
294 0
Jetpack之DataStore解析