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

参考网站:官方网站

相关推荐
TAEHENGV18 小时前
创建目标模块 Cordova 与 OpenHarmony 混合开发实战
android·java·开发语言
zjw_swun18 小时前
Compose原理简易实现
android·composer
青莲84319 小时前
Kotlin Flow 深度探索与实践指南——中部:实战与应用篇
android·前端
建群新人小猿20 小时前
陀螺匠企业助手-我的日程
android·大数据·运维·开发语言·容器
_李小白20 小时前
【Android FrameWork】第三十九天:DeviceStorageManagerService
android
程序员老刘20 小时前
Kotlin vs Dart:当“优雅”变成心智负担,我选择了更简单的 Dart
flutter·kotlin·dart
不急不躁12321 小时前
Android16 给应用默认获取权限
android·java
用户416596736935521 小时前
拒绝 Race Condition:深入理解 StateFlow 的取值与更新
android
青莲84321 小时前
Kotlin Flow 深度探索与实践指南——上部:基础与核心篇
android·前端
恋猫de小郭1 天前
2025 年终醒悟,AI 让我误以为自己很强,未来程序员的转型之路
android·前端·flutter