【问题标题】:Return Map object by DAO method通过 DAO 方法返回 Map 对象
【发布时间】:2018-09-01 11:51:56
【问题描述】:

我想在我的 dao 对象中有这样的方法

@Query("SELECT c.name, sum(p.value) FROM payments p, paymentCategories c WHERE p.categoryId = c.id GROUP BY c.name")
fun getCategoryStats(): Map<String, Float>

但我得到了错误

错误:不确定如何将 Cursor 转换为此方法的返回类型 公共抽象 java.util.Map

是否可以将其更改为工作版本?

所以返回的类型可以不同,但​​主要条件是

  1. db 中只能有一个查询
  2. 我想避免额外的代码,比如只为此方法创建额外的数据结构

【问题讨论】:

  • 您也许可以创建一个从 CursorMapTypeConverter 并将其注册到您的 DAO,尽管我没有尝试过这种特殊情况(从 DAO 转换返回值方法)。不过,错误消息表明可以在此处使用TypeConverter
  • 很遗憾没有内置支持。当您汇总数据以获取所需信息时,这种情况可能并不罕见。还是谢谢)
  • 无论如何我都无法使用 Cursor to Map\Pair 转换器。要么不支持,要么我错过了一个简单的观点。作为解决方案,我创建了自己的 Tuple 对象,并返回它的列表。

标签: android kotlin android-room


【解决方案1】:

虽然我不认为这可以在 Dao 中完成,但在使用转换查询存储库中的 LiveData 或 viewModel(或者您正在查询列表的任何位置)时可以轻松完成。因为我不知道你的数据名,所以我使用的是虚构的:

val categoryStatsMap: LiveData<Map<String, Float>> = 
    Transformations.map(
        database.categoryStatsDao.getCategoryStats()) {it ->
            it.map {it.key to it.value}.toMap()
}

'it.key' 和 'it.value' 是实体对象中的字段,您想在地图中用作... 键和值对。 转换为您提供基于另一个实时数据对象的实时数据对象。我不知道开销是多少,但我认为它不应该太大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 2020-02-03
    • 2013-11-28
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    相关资源
    最近更新 更多