📦 Room · 三大核心组件

Entity · DAO · Database
📋 Entity 数据表映射 @Entity · 字段 · 主键 ⚡ DAO 数据访问对象 @Insert · @Query · @Delete 🗄️ DB Database 持有 DAO ⬆️ Room 三剑客:Entity ↔ DAO ↔ Database
📌 组件职责一览 各司其职 · 紧密协作
📋 Entity⚡ DAO🗄️ Database
表结构 数据模型 操作接口 CRUD 数据库中枢 连接 & 管理
  • 使用 @Entity 注解
  • 定义表名、列名、主键
  • 支持索引、外键、嵌套
  • 每个字段对应一列
  • 使用 @Dao 注解接口
  • @Insert / @Update / @Delete
  • @Query 自定义 SQL
  • 支持 Flow, LiveData, Rx
  • 继承 RoomDatabase
  • 声明抽象 DAO 方法
  • 单例模式,版本管理
  • 迁移 & 预填充数据
🧩 深入职责 · 代码实战

📋 Entity 表

数据实体,对应 SQLite 表。每个 Entity 类定义一个表结构,字段映射为列。

关键注解: @Entity, @PrimaryKey, @ColumnInfo, @ForeignKey

⚡ DAO 访问

数据访问对象,定义操作数据库的方法。支持 suspend 函数、Flow、RxJava。

关键注解: @Dao, @Insert, @Query, @Update, @Delete

🗄️ Database 中枢

数据库持有者,提供 DAO 实例。负责创建、升级、版本管理。

关键点: @Database, entities[], version, 单例, 迁移

// ========== 1. Entity (用户表) ==========
@Entity(tableName = "users")
data class User(
    @PrimaryKey(autoGenerate = true) val uid: Int = 0,
    @ColumnInfo(name = "full_name") val name: String,
    val age: Int
)

// ========== 2. DAO (数据访问) ==========
@Dao
interface UserDao {
    @Query("SELECT * FROM users")
    fun getAll(): List<User>

    @Insert
    suspend fun insert(user: User)

    @Delete
    suspend fun delete(user: User)
}

// ========== 3. Database (数据库) ==========
@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 getInstance(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "my_room.db"
                ).build().also { INSTANCE = it }
            }
        }
    }
}
🔄 协作流程 一次查询的生命周期
  1. App 通过 AppDatabase.getInstance() 获取 Database 单例。
  2. 调用 database.userDao() 获得 DAO 实现(Room 自动生成)。
  3. DAO 方法(如 getAll())编译时映射为 SQL,执行查询。
  4. 查询结果自动转换为 Entity 对象(或 List<Entity>)。
  5. 若使用 Flow / LiveData,数据变更自动推送,UI 层响应更新。