
1) 【一句话结论】使用Room数据库时,通过实体类映射数据表、DAO接口封装CRUD操作,结合索引、批量操作和缓存策略优化查询性能,确保数据持久化且高效访问。
2) 【原理/概念讲解】
Room是Jetpack提供的数据库访问组件,核心组件包括:
@Entity注解标记,定义数据模型,字段对应数据库表结构,需用@PrimaryKey标注主键。类比:实体类像数据库表,字段是表列。@Dao注解标记的接口,提供增删改查方法,Room会自动生成SQL语句,无需手动写SQL。类比:DAO像数据库操作接口,封装了具体的数据库操作逻辑。@Database注解标记的抽象类,包含实体类列表和版本号,是Room的入口,管理实体和DAO。3) 【对比与适用场景】
| 对比项 | Room | 原生SQLite |
|---|---|---|
| 定义 | Jetpack数据库访问抽象层 | 直接操作SQLite数据库 |
| 特性 | 编译时检查、自动生成SQL、事务支持 | 手动写SQL、无编译时检查 |
| 使用场景 | 需高效、安全、易维护的数据库操作(如复杂查询、事务) | 简单场景、对性能要求不高、需深度定制SQL |
4) 【示例】
@Entity(tableName = "course_progress", indices = [Index(value = ["courseId"], name = "idx_course_id"), Index(value = ["userId"], name = "idx_user_id")])
data class CourseProgress(
@PrimaryKey val courseId: String,
val userId: String,
val lastChapter: Int,
val lastTime: Long,
val completed: Boolean
)
@Dao
interface CourseProgressDao {
@Query("SELECT * FROM course_progress WHERE userId = :userId")
fun getProgressByUserId(userId: String): List<CourseProgress>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertProgress(progress: CourseProgress)
@Query("UPDATE course_progress SET lastChapter = :chapter, lastTime = :time WHERE courseId = :courseId")
suspend fun updateProgress(courseId: String, chapter: Int, time: Long)
}
@Database(entities = [CourseProgress::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun courseProgressDao(): CourseProgressDao
}
courseId和userId字段添加索引,加速查询。@Insert(onConflict = OnConflictStrategy.REPLACE)批量插入数据,减少数据库操作次数。LiveData结合数据库查询结果,或内存缓存(如LruCache)配合数据库,优先从内存取数据。5) 【面试口播版答案】
“面试官您好,针对学习进度和课程信息的持久化存储,我会用Room数据库方案。首先,通过实体类映射数据表,比如CourseProgress实体对应数据库表,包含courseId、userId等字段,用@PrimaryKey标注主键。然后DAO接口封装CRUD操作,比如getProgressByUserId查询方法,Room会自动生成SQL。接着,数据库类作为入口,管理实体和DAO。为了优化性能,我会做三方面:一是索引,给courseId和userId字段添加索引,加速查询;二是批量操作,用@Insert(onConflict=REPLACE)批量插入,减少数据库操作次数;三是缓存策略,比如用LiveData结合数据库查询,或者内存缓存配合数据库,对于频繁访问但变化小的数据(如用户课程列表),先查数据库,再缓存到内存,后续查询优先从内存取。这样既能保证数据持久化,又能提升查询性能。”
6) 【追问清单】
Migration机制,通过Migration类实现版本升级逻辑(如添加新表、修改字段)。@Index注解添加,创建时机在数据库初始化时,影响是提升查询速度,但会增加写入时间。LruCache),变化频繁或不频繁则直接数据库,结合LiveData/Flow实现数据流。suspend函数和事务(@Transaction)保证原子性,避免并发冲突(如批量更新时用事务)。7) 【常见坑/雷区】