0Pricing
Android Academy · 课时

Room 数据库

使用 Room 在本地持久化结构化数据。定义实体、DAO 和数据库类。使用 SQL 查询,并通过 LiveData 或 Flow 观察结果。

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

什么是 Room?

Room 是 Google 为 Android 推荐的持久化库。它是 SQLite 的封装,提供以下功能:

  • 在编译时验证的类型安全 SQL 查询
  • Kotlin 协程支持
  • LiveData / Flow 集成
  • 支持架构变更迁移

Room 的三个组件

Room 由三个注解构成:

  • @Entity — 映射到数据库表的数据类
  • @Dao(数据访问对象)— 包含 SQL 查询的接口
  • @Database — 将所有内容连接起来的主数据库类

添加 Room 依赖

将 Room 添加到 app/build.gradle:

// app/build.gradle
plugins {
    id 'kotlin-kapt'  // needed for Room annotation processor
}

dependencies {
    val roomVersion = "2.6.1"
    implementation "androidx.room:room-runtime:$roomVersion"
    kapt "androidx.room:room-compiler:$roomVersion"
    implementation "androidx.room:room-ktx:$roomVersion" // coroutine support
}

定义实体

使用 @Entity 注解数据类,以创建数据库表:

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "notes")
data class Note(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    val title: String,
    val body: String,
    val createdAt: Long = System.currentTimeMillis()
)

// Each field = one column in the database table
// @PrimaryKey autoGenerate = Room assigns the id automatically

创建 DAO

在 DAO 接口中定义查询。Room 会为您生成实现:

import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface NoteDao {

    @Query("SELECT * FROM notes ORDER BY createdAt DESC")
    fun getAllNotes(): Flow<List<Note>>  // emits new list whenever data changes

    @Query("SELECT * FROM notes WHERE id = :noteId")
    suspend fun getNoteById(noteId: Int): Note?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(note: Note)

    @Update
    suspend fun update(note: Note)

    @Delete
    suspend fun delete(note: Note)
}

创建数据库

@Database 类是进入 Room 的入口。请创建一次,并将其保持为单例:

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context

@Database(entities = [Note::class], version = 1, exportSchema = false)
abstract class NoteDatabase : RoomDatabase() {

    abstract fun noteDao(): NoteDao

    companion object {
        @Volatile private var INSTANCE: NoteDatabase? = null

        fun getInstance(context: Context): NoteDatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    context.applicationContext,
                    NoteDatabase::class.java,
                    "note_database"
                ).build().also { INSTANCE = it }
            }
        }
    }
}

在 ViewModel 中使用 Room

使用协程在 ViewModel 中连接 DAO:

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch

class NoteViewModel(private val dao: NoteDao) : ViewModel() {

    val notes = dao.getAllNotes()  // Flow — auto-updates when DB changes

    fun addNote(title: String, body: String) {
        viewModelScope.launch {
            dao.insert(Note(title = title, body = body))
        }
    }

    fun deleteNote(note: Note) {
        viewModelScope.launch {
            dao.delete(note)
        }
    }
}

在界面中观察 Room 数据

在 Activity 或 Fragment 中收集来自 Room 的 Flow:

import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.launch

class NoteActivity : AppCompatActivity() {
    private val viewModel: NoteViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // ...

        lifecycleScope.launch {
            viewModel.notes.collect { notes ->
                adapter.submitList(notes)  // update RecyclerView
            }
        }
    }
}

数据库迁移

更改 Entity 时(例如添加列或重命名表),必须提供迁移,以免丢失现有用户数据。

递增 @Database(version = 2) 中的版本号,并定义一个 Migration 对象,其中包含用于将旧架构转换为新架构的 SQL。

快速检查

哪个 Room 注解用于标记接口方法为 SQL SELECT 查询?

总结:Room 数据库

现在您可以使用本地数据持久化构建应用:

  • @Entity — 数据类 → 数据库表
  • @Dao — 包含 @Query、@Insert、@Delete 的接口
  • @Database — 单例入口
  • 从 DAO 返回 Flow<List>,以实现实时更新
  • 使用 viewModelScope.launch 从 ViewModel 调用 DAO

下一步:使用协程编写无需回调的异步代码。

常见问题解答

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

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

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

使用 Room 在本地持久化结构化数据。定义实体、DAO 和数据库类。使用 SQL 查询,并通过 LiveData 或 Flow 观察结果。 你通过在浏览器中直接运行的动手代码来练习 Android Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Android Academy 需要有经验吗?

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

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

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

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

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

此课程中的所有课时

  1. ViewModel 与 LiveData
  2. Room 数据库
  3. 协程与挂起函数
  4. 仓储模式
  5. Navigation 组件
  6. 使用 Hilt 进行依赖注入
← 返回 Android Academy