Android Room部件协同使用

Android 中的 Room 是 Google 官方推出的 SQLite 对象映射(ORM)库,用于简化本地数据库操作。它通过注解方式定义数据库结构,并自动生成底层实现,支持编译时 SQL 校验、LiveData 监听、协程等现代架构组件。


✅ Room 的三个核心部件

组件 作用说明
Entity 定义数据库表结构,每个类对应一张表,使用 @Entity 注解。
DAO(Data Access Object) 定义对表的增删改查操作,使用 @Dao 注解。
Database 数据库持有者,继承 RoomDatabase,使用 @Database 注解,包含所有实体和 DAO。

✅ 示例:使用 Room 管理用户表

1️⃣ 添加依赖(build.gradle)

  • project build.gradle.kts
gradle 复制代码
plugins {
    id("com.android.application") version "8.1.4" apply false
    id("org.jetbrains.kotlin.android") version "1.9.22" apply false
    // ① 使用 KSP 生成 Room 代码(官方最新推荐)
    id("com.google.devtools.ksp") version "1.9.22-1.0.17" apply false
}
  • app build.gradle.kts
gradle 复制代码
plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
    id("com.google.devtools.ksp")   // Room 注解处理器
}

android {
    compileSdk = 34
    defaultConfig {
        applicationId = "com.example.roomdemo"
        minSdk = 21
        targetSdk = 34
        versionCode = 1
        versionName = "1.0"
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions.jvmTarget = "1.8"
}

dependencies {
    val roomVersion = "2.8.3"
    implementation("androidx.room:room-runtime:$roomVersion")
    ksp("androidx.room:room-compiler:$roomVersion")   // KSP 生成代码
    implementation("androidx.room:room-ktx:$roomVersion") // 协程扩展
    implementation("androidx.core:core-ktx:1.12.0")
}

2️⃣ 创建实体类Entity -> 表(User.kts)

kotlin 复制代码
@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    val age: Int
)

3️⃣ 创建 DAO 接口 -> SQL操作(UserDao.kts)

kotlin 复制代码
@Dao
interface UserDao {
    @Insert(onConflict = OnConflictStrategy.IGNORE)
    suspend fun insert(user: User)

    @Query("SELECT * FROM user ORDER BY name ASC")
    fun getAllUsers(): Flow<List<User>>   // 返回 Flow,可观察

    @Delete
    suspend fun delete(user: User)
}

4️⃣ 创建数据库类 Database → 容器(AppDatabase.kts)

kotlin 复制代码
@Database(entities = [User::class], version = 1, exportSchema = false)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao

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

        fun get(context: Context): AppDatabase =
            INSTANCE ?: synchronized(this) {
                INSTANCE ?: Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app.db"
                ).build().also { INSTANCE = it }
            }
    }
}

5️⃣ 初始化并使用数据库: 协程+flow(MainActivity.kts)

kotlin 复制代码
class UserViewModel(app: Application) : AndroidViewModel(app) {
    private val dao = AppDatabase.get(app).userDao()

    val users: StateFlow<List<User>> = dao.getAllUsers()
        .stateIn(viewModelScope, SharingStarted.WhileSubscribed(), emptyList())

    fun add(name: String, age: Int) = viewModelScope.launch {
        dao.insert(User(name = name, age = age))
    }

    fun delete(user: User) = viewModelScope.launch {
        dao.delete(user)
    }
}

可观察的 Compose 界面(仅关键代码)

kotlin 复制代码
@Composable
fun UserScreen(vm: UserViewModel = viewModel()) {
    val list by vm.users.collectAsState()

    Column {
        Button(onClick = { vm.add("Alice", 20) }) { Text("添加") }
        LazyColumn {
            items(list) { user ->
                Text("${user.name}  ${user.age}",
                    modifier = Modifier.clickable { vm.delete(user) })
            }
        }
    }
}

小结

部件 作用 是否必须
Entity 一张表 = 一个 @Entity data class ✅
DAO 把 SQL 语句翻译成接口方法 ✅
Database 继承 RoomDatabase,提供 DAO 实例 ✅
KSP 取代 KAPT,编译更快 推荐
room-ktx 支持 suspend + Flow 推荐

✅ 小贴士

  • Room 不允许在主线程操作数据库 ,需使用异步线程、协程或 LiveData。
  • 可配合 ViewModel + LiveData 实现生命周期感知的数据库操作 。

✅ 总结一句话

Room = Entity(表) + DAO(操作) + Database(数据库),三者配合实现类型安全、简洁高效的本地数据库管理。


相关推荐
IMPYLH4 分钟前
HTML 的 <tfoot> 元素
前端·javascript·html
像风一样自由20208 分钟前
42.VueReactNextjs如何为AI应用设计前端交互
前端·人工智能·大模型·交互·rag·智能体
鬼手点金9 分钟前
Claude Code示范案例-修复 Bug 工作流
java·服务器·前端·javascript·bug·openclaw
李游Leo13 分钟前
《HarmonyOS 7 ArkGraphics 3D 空间设计开发实战》07:复杂3D场景的帧率、内存与资源性能优化【鸿蒙心迹】
android·3d·性能优化·harmonyos
柳杉19 分钟前
用 GPT-6 Astra 和 Tripo3D 做智慧农业 3D 大屏:从调研到可巡检园区全流程实录
前端·ai编程·数据可视化
天神哥哥啊20 分钟前
unity联调注意事项-安卓
android·unity·游戏引擎
机核研创社21 分钟前
polo 长袖短裤套装自动化产线:八台机器排队接力
android·java·自动化
JosieBook22 分钟前
【数据库】MySQL 实战精通系列 · 第2篇:数据建模与建表实战
android·数据库·mysql
特创数字科技23 分钟前
【uni-app x】告别系统相机限制!三端通用自定义相机组件:任意布局、静默拍照、录像、水印叠加、连拍回图一次搞定
前端·数码相机·uni-app
Martin -Tang33 分钟前
uniapp app嵌套webview 弹窗方式
android·ios·uni-app