在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
相关产品推荐
相关产品推荐

