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值为0GROUP 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
相关产品推荐
相关产品推荐

