Room新手入门

Room

Room 是所谓的 ORM(对象关系映射)库

依赖
  1. 在项目级 build.gradle 文件中,在 ext 代码块中定义 room_version

    ext {
    kotlin_version = "1.6.20"
    nav_version = "2.4.1"
    room_version = '2.4.2'
    }

  2. 在应用级 build.gradle 文件中,在依赖项列表末尾添加以下依赖项。

gradle 复制代码
implementation "androidx.room:room-runtime:$room_version"
kapt "androidx.room:room-compiler:$room_version"

// optional - Kotlin Extensions and Coroutines support for Room
implementation "androidx.room:room-ktx:$room_version"
使用
  1. 构建实体

使用 Room 时,每个表都由一个类表示。在 Room 等 ORM(对象关系映射)库中,这些类通常称为模型类或实体。

kotlin 复制代码
@Entity
data class Schedule(
   @PrimaryKey val id: Int,
   @NonNull @ColumnInfo(name = "stop_name") val stopName: String,
   @NonNull @ColumnInfo(name = "arrival_time") val arrivalTime: Int
)

要有主键,每个ColumnInfo是数据表里面的列

  1. 构建数据访问对象

一个提供数据访问的 Kotlin 类。具体而言,会在 DAO 中包含用于读取和操作数据的函数。对 DAO 调用函数相当于对数据库执行 SQL 命令。

kotlin 复制代码
@Dao
interface ScheduleDao {
    @Query("SELECT * FROM schedule ORDER BY arrival_time ASC")
fun getAll(): List<Schedule>
}

定义一个函数 getAll(),用于返回包含 @Query 注解的 Schedule 对象的列表

  1. 访问数据

虽然已经构建好整个访问数据的方法,但是我们也不能直接用VIew去访问,得用ViewModel,这也是推荐的MVVM模型

kotlin 复制代码
class BusScheduleViewModel(private val scheduleDao: ScheduleDao): ViewModel() {

调用方法就写在这上面

  1. 管理数据

我们需要一个类去管理跟数据有关的类,为什么要这么做?因为

a. 指定数据库中定义的实体。

b. 提供对每个 DAO 类的单个实例的访问。

c. 执行任何其他设置,例如预先填充数据库。

先添加一个抽象类AppDatabase,名字随意

kotlin 复制代码
@Database(entities = arrayOf(Schedule::class), version = 1)
abstract class AppDatabase: RoomDatabase() {
    companion object {
        @Volatile
private var INSTANCE: AppDatabase? = null
        
        fun getDatabase(context: Context): AppDatabase {
    return INSTANCE ?: synchronized(this) {
        val instance = Room.databaseBuilder(
            context,
            AppDatabase::class.java,
            "app_database")
            .createFromAsset("database/bus_schedule.db")
            .build()
        INSTANCE = instance

        instance
    }
}
        
}
    abstract fun scheduleDao(): ScheduleDao
}

通过这个类,可以轻松访问DAO类

使用 AppDatabase 类时,您需要确保仅存在一个数据库实例,以防出现竞态条件或其他潜在问题。该实例存储在伴生对象中,并且您还需要用一个方法来返回现有实例或首次创建数据库。此方法在伴生对象中定义。将以下 companion object 添加到 scheduleDao() 函数的正下方。

类前面的注解版本号:每次对架构做出更改时,版本号都会递增。应用会对照数据库中的版本检查此版本,以确定是否应执行迁移以及应如何执行迁移。

  1. 应用

在Application里面初始化
val database: AppDatabase by lazy { AppDatabase.getDatabase(this) }

参考网站:官方网站

相关推荐
EngZegNgi7 分钟前
安卓应用启动崩溃的问题排查记录
android·crash·启动崩溃
火柴就是我1 小时前
每日见闻之Container Decoration
android·flutter
天枢破军1 小时前
【AOSP】解决repo拉取提示无法连接android.googlesource.com
android
whysqwhw1 小时前
OkHttp之AndroidPlatform类分析
android
XiaolongTu1 小时前
Kotlin Flow详述:从一个“卡顿”问题到线程切换的本质
android·面试
Kapaseker1 小时前
全网最详细的Compose Stable讲解,你一定要看
android
solo_991 小时前
使用Android Studio 聊微信
android
whysqwhw1 小时前
OkHttp PublicSuffix包的平台化设计分析
android
whysqwhw1 小时前
Conscrypt 源码分析全图解(附精要讲解)
android
一只柠檬新2 小时前
Kotlin object单例到底是懒汉式还是饿汉式
android·kotlin