Room 是 Jetpack 提供的一个 ORM(对象关系映射)库,简化了 Android 中的 SQLite 数据库操作,无需编写复杂的 SQL 语句就能实现数据的增删改查。
一、添加依赖
在 build.gradle
(Module 级别)中添加以下依赖
dependencies {
// Room 核心库
implementation "androidx.room:room-runtime:2.5.2"
// 编译器(kapt 用于 Kotlin)
kapt "androidx.room:room-compiler:2.5.2"
// Kotlin 扩展(可选,提供协程支持)
implementation "androidx.room:room-ktx:2.5.2"
}
二、核心组件
Room 有 3 个核心组件:
Entity:对应数据库中的表(用 @Entity 注解)
Dao:数据访问对象,定义增删改查方法(用 @Dao 注解)
Database:数据库持有者,管理连接(用 @Database 注解)
三、完整代码实现
1. 创建 Entity(数据模型类)
Kotlin
import androidx.room.Entity
import androidx.room.PrimaryKey
// 定义数据库表(表名默认是类名,也可自定义)
@Entity(tableName = "users")
data class User(
// 主键,autoGenerate = true 表示自增
@PrimaryKey(autoGenerate = true) val id: Int = 0,
val name: String,
val age: Int
)
2. 创建 Dao(数据访问接口)
Kotlin
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow
@Dao
interface UserDao {
// 插入数据
@Insert
suspend fun insert(user: User)
// 更新数据
@Update
suspend fun update(user: User)
// 删除数据
@Delete
suspend fun delete(user: User)
// 查询所有数据(返回 Flow,数据变化时自动通知)
@Query("SELECT * FROM users ORDER BY id DESC")
fun getAllUsers(): Flow<List<User>>
// 根据 ID 查询
@Query("SELECT * FROM users WHERE id = :id")
suspend fun getUserById(id: Int): User?
}
3. 创建 Database 类
Kotlin
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context
// 定义数据库,包含的表(entities)和版本号(version)
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
// 提供 Dao 实例
abstract fun userDao(): UserDao
// 单例模式,避免重复创建数据库连接
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
fun getDatabase(context: Context): AppDatabase {
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
AppDatabase::class.java,
"user_database" // 数据库名称
).build()
INSTANCE = instance
instance
}
}
}
}
4. 在 ViewModel 中使用
Kotlin
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.launch
class UserViewModel(private val userDao: UserDao) : ViewModel() {
// 将 Flow 转换为 LiveData,供 UI 观察
val allUsers = userDao.getAllUsers().asLiveData()
// 插入用户(在协程中执行,避免阻塞主线程)
fun insertUser(user: User) {
viewModelScope.launch {
userDao.insert(user)
}
}
// 更新用户
fun updateUser(user: User) {
viewModelScope.launch {
userDao.update(user)
}
}
// 删除用户
fun deleteUser(user: User) {
viewModelScope.launch {
userDao.delete(user)
}
}
}
5. 在 Activity 中使用
Kotlin
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button
import android.widget.EditText
import androidx.lifecycle.ViewModelProvider
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.example.roomdemo.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var userViewModel: UserViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// 获取数据库实例
val db = AppDatabase.getDatabase(this)
// 创建 ViewModel
userViewModel = ViewModelProvider(this)[UserViewModel::class.java]
// 观察用户列表变化,更新 RecyclerView
userViewModel.allUsers.observe(this) { users ->
// 这里可以更新 RecyclerView适配器
// adapter.submitList(users)
}
// 点击按钮添加用户
binding.btnAdd.setOnClickListener {
val name = binding.etName.text.toString()
val age = binding.etAge.text.toString().toIntOrNull() ?: 0
if (name.isNotEmpty()) {
userViewModel.insertUser(User(name = name, age = age))
}
}
}
}
上面的 Room 示例代码遵循了 Android 推荐的MVVM 架构模式。
MVVM 是一种软件架构模式,广泛应用于 Android、iOS 等客户端开发中,核心是通过分层解耦,让代码更易于维护、测试和扩展。其名称由三个核心部分的首字母组成:Model(模型)、View(视图)、ViewModel(视图模型)。
Model:管数据(存、取、处理)。
View:管界面(展示、交互)。
ViewModel:管逻辑(连接 View 和 Model,处理业务)。
viewModelScope
是 Jetpack ViewModel 库中专门为 ViewModel 设计的协程作用域(Coroutine Scope),用于在 ViewModel 中安全地启动和管理协程,避免内存泄漏和生命周期问题。