Kotlin Room SUM列求和查询报错,求Dao方法正确返回类型写法
解决Room列求和的返回类型问题
报错原因
你之前返回Flow<Cursor>触发报错,是因为Room不支持直接把Cursor作为查询结果返回——Room要求返回类型必须是实体类、符合规范的POJO或者基本数据类型,Cursor不在这个范围内,所以会抛出构造器相关的错误。
两种可行解决方案
方案一:直接返回基本类型的Flow(简单场景首选)
SUM(sum)返回的是单个数值,Room可以直接将其映射为可空的基本类型Flow(当表为空时SUM会返回null,所以用可空类型更稳妥):
修改Dao中的方法:
@Dao interface Dao { @Insert fun InsertItem(item: Income) @Query("SELECT SUM(sum) AS value FROM income") fun getSumItem(): Flow<Float?> }
方案二:用POJO封装结果(适合扩展场景)
如果后续需要返回多个聚合字段,或者想更清晰地封装结果,可以创建一个专门的POJO类:
首先定义POJO:
// 不需要添加@Entity注解,这只是用来接收查询结果的普通数据类 data class SumResult( @ColumnInfo(name = "value") val total: Float? )
然后修改Dao方法的返回类型:
@Dao interface Dao { @Insert fun InsertItem(item: Income) @Query("SELECT SUM(sum) AS value FROM income") fun getSumItem(): Flow<SumResult> }
这两种方案都能解决你遇到的构造器报错问题,根据自身需求选择即可。
内容的提问来源于stack exchange,提问作者Farodin
相关产品推荐
相关产品推荐

