You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room数据库查询:获取带文件计数的文件夹详情Flow

Room实现文件夹文件数量统计查询

1. 完善实体类的Room注解

首先给File和Folder添加Room必需的实体注解,确保Room能识别对应的数据库表:

@Entity(tableName = "files")
data class File(
    @PrimaryKey(autoGenerate = true) val id: Long = 0,
    // 你的其他字段...
    val folderId: Long? = null
)

@Entity(tableName = "folders")
data class Folder(
    @PrimaryKey val id: Long,
    val name: String
)

2. 定义查询结果模型FolderDetailWithCount

保证模型属性名和查询语句返回的列名完全匹配:

data class FolderDetailWithCount(
    val id: Long,
    val name: String,
    val count: Long
)

3. 编写Dao层查询方法

在Dao接口中编写SQL查询,通过LEFT JOIN关联文件夹和文件表,统计每个文件夹的文件数量:

@Dao
interface FolderDao {
    @Query("""
        SELECT f.id, f.name, COUNT(file.id) AS count
        FROM folders f
        LEFT JOIN files file ON f.id = file.folderId
        GROUP BY f.id, f.name
    """)
    fun getFoldersWithFileCount(): Flow<List<FolderDetailWithCount>>
}

查询说明:

  • LEFT JOIN:确保即使文件夹下没有文件,也会被纳入结果,此时count值为0
  • GROUP BY f.id, f.name:按文件夹的唯一标识和名称分组,保证每个文件夹只返回一条统计记录
  • COUNT(file.id):自动忽略folderId为null的文件,以及无匹配的空记录,准确统计分组内的有效文件数

4. 使用数据流

在Repository和ViewModel中直接调用Dao方法获取Flow,实时监听数据库变化:

// Repository层
class FolderRepository(private val folderDao: FolderDao) {
    fun getFoldersWithCount(): Flow<List<FolderDetailWithCount>> {
        return folderDao.getFoldersWithFileCount()
    }
}

// ViewModel层
class FolderViewModel(repository: FolderRepository) : ViewModel() {
    val foldersWithCount: Flow<List<FolderDetailWithCount>> = repository.getFoldersWithCount()
}

内容的提问来源于stack exchange,提问作者Sanjay verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:25:18