在android flow + room,如何监控一个List of Flow

In android flow + room, How to monitor a List of Flow

你好,

----DAO---
@Transaction
@Query("select * from expenses where date= :date")
suspend fun getExpenseWithTagByDate(date: LocalDate): Flow<List<ExpenseWithTag>>

我有如下的 Dao 代码。 但是如果我需要查询两天或更长时间,我该怎么办?

fun getEnpenseWithTagByMonth(dates: List<LocalDate>) =
    flow {
        val lists = arrayListOf<Flow<List<ExpenseWithTag>>>()
        dates.forEach {
            val expenses = expenseDao.getExpenseWithTagByDate(it)
            lists.add(expenses)
        }
        emit(lists)
    }.flowOn(Dispatchers.IO)

然后

getEnpenseWithTagByMonth(dates).asLiveData()

终于搞定类型了,太惨了:

ArrayList<Flow<List<ExpenseWithTag>>>>>

如何写出简洁高效的代码

回答你的问题

if I need query two days or more, How can I do it?

您可以使用 in 查询,然后将它们分组。

@Query("select * from expenses where date IN (:dates)")
suspend fun getExpenseWithTagByDate(dates: List<LocalDate>): Flow<List<ExpenseWithTag>>
fun getEnpenseWithTagByMonth(dates: List<LocalDate>): Flow<List<List<ExpenseWithTag>>> {
    return expenseDao.getExpenseWithTagByDate(dates).map { expenses ->
        expenses.groupBy{ expense -> expense.date }.values
    }
}