0Pricing
Android Academy · 课时

Room 数据库类

创建并访问您的数据库

Room 数据库类 是 CoddyKit 上的免费 Android Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Android Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Android Academy 课程共包含 4 节课。

将各部分联系起来

数据库类是主要访问入口。它列出实体、声明版本,并暴露 DAO。

@Database 注解

请创建一个继承 RoomDatabase 的抽象类,并使用 @Database 对其进行注解。

import androidx.room.Database
import androidx.room.RoomDatabase

@Database(
    entities = [User::class],
    version = 1
)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

列出实体和版本

entities 数组告诉 Room 要创建哪些表。version 编号用于跟踪架构更改,以便进行迁移。

暴露 DAO

对于每个 DAO,请声明一个返回该 DAO 类型的抽象函数。Room 会实现它。

abstract fun userDao(): UserDao
abstract fun noteDao(): NoteDao

构建数据库

使用 Room.databaseBuilder 创建实例。它需要应用上下文、类和数据库名称。

val db = Room.databaseBuilder(
    context.applicationContext,
    AppDatabase::class.java,
    "app.db"
).build()

将其设为单例

创建数据库的开销较大,因此应为整个应用创建一个实例。一种常见模式是使用带有同步获取器的伴生对象。

companion object {
    @Volatile private var INSTANCE: AppDatabase? = null
    fun get(context: Context): AppDatabase =
        INSTANCE ?: synchronized(this) {
            INSTANCE ?: build(context).also { INSTANCE = it }
        }
}

单例为何重要

多个数据库实例会为同一个文件打开多个连接,从而导致不一致并浪费内存。一个共享实例可以保持唯一事实来源。

使用 Hilt 提供数据库

在实际应用中,您通常会通过依赖注入提供数据库(Hilt 课程会介绍),而不是手动创建单例。

@Provides
@Singleton
fun provideDb(@ApplicationContext ctx: Context) =
    Room.databaseBuilder(ctx, AppDatabase::class.java, "app.db")
        .build()

架构更改与迁移

更改实体时,请递增 version,并提供一个描述如何通过 SQL 转换旧数据的迁移。

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(db: SupportSQLiteDatabase) {
        db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER NOT NULL DEFAULT 0")
    }
}

破坏性迁移

在早期开发阶段,您可以使用 fallbackToDestructiveMigration(),它会删除并重新创建表,而不是进行迁移。使用真实用户数据的生产应用绝不能采用此方式。

访问 DAO

获得数据库实例后,请获取 DAO,并在协程中调用其方法。

val dao = db.userDao()
viewModelScope.launch {
    dao.insert(User(1, "Ada", "ada@x.com"))
}

快速检查

请测试您对数据库类的理解。

回顾

您学到了:

  • @Database 列出实体、设置版本并暴露 DAO。
  • 使用 Room.databaseBuilder 将其构建为单例。
  • 架构更改需要递增版本并提供迁移。

常见问题解答

「Room 数据库类」课时是免费的吗?

是的 — 「Room 数据库类」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Android Academy 课程的其余内容,请升级到 CoddyKit PRO。 Android Academy 课程共包含 4 节课。

「Room 数据库类」这节课中我会学到什么?

创建并访问您的数据库 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Android Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「Room 数据库类」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Android Academy 课中编写并运行代码吗?

能。每节 Android Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 实体和 DAO
  2. Room 数据库类
  3. 查询和关系
  4. 使用 Flow 观察数据
← 返回 Android Academy