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

在KMM中使用SqlDelight+Flow时,如何将实体映射到辅助类?

实现SqlDelight查询结果映射到辅助类的方案

当然可以实现你想要的效果,只是需要调整下调用顺序——因为SqlDelight的Query对象本身不支持直接调用map,得先把查询结果转换成数据流或者直接获取实体列表后再做映射。下面给两种常用的实现方式:

方式一:先转Flow再映射整个列表

这是最直观的写法,先通过asFlow().mapToList()拿到包含实体列表的Flow,再对整个列表做映射:

val players: Flow<List<YourHelperClass>> = 
  playerQueries.selectAll()
    .asFlow()
    .mapToList()
    .map { playerList ->
      playerList.map { it.toOtherClass() }
    }

方式二:逐个处理查询结果元素

如果需要更细粒度地处理每个查询结果,可以直接在Flow的map里执行查询并映射元素:

val players: Flow<List<YourHelperClass>> = 
  playerQueries.selectAll()
    .asFlow()
    .map { query ->
      // 执行查询拿到实体列表,再逐个映射到辅助类
      query.executeAsList().map { it.toOtherClass() }
    }

补充说明

  • 你可以给HockeyPlayer写个扩展函数简化映射逻辑,比如:
    fun HockeyPlayer.toOtherClass() = YourHelperClass(
        id = this.id,
        name = this.name
        // 其他属性按需映射
    )
    
  • 为什么你最初的写法行不通?因为playerQueries.selectAll()返回的是Query实例,这个类没有提供直接的map方法,必须先通过asFlow()转成数据流,或者调用executeAsList()直接获取实体列表,才能进行映射操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:35:34