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 反馈 — 无需本地设置。