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

参考网站:官方网站

相关推荐
张小潇43 分钟前
AOSP15 Input专题InputDispatcher源码分析
android
TT_Close1 小时前
【Flutter×鸿蒙】debug 包也要签名,这点和 Android 差远了
android·flutter·harmonyos
Kapaseker2 小时前
2026年,我们还该不该学编程?
android·kotlin
雨白18 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk18 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING19 小时前
RN容器启动优化实践
android·react native
恋猫de小郭21 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker1 天前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴1 天前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭2 天前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter