在Transform.map函数内部使用协程

时间:2020-01-26 13:13:41

标签: android kotlin transformation kotlin-coroutines

这是一个棘手的问题。
我有一个来自Room DB的查询。结果是一个关系POJO

class MessageWithMsgQueueAccount {

    @Embedded
    var message: MessageDto? = null

    @Relation(parentColumn = "clientMessageId", entityColumn = "clientMessageId", entity = MessageQueueDto::class)
    var messageQueueList: List<MsgQueueAccount> = ArrayList()


}

因此,当我得到一个结果时,我对该对象应用了一个转换,因此我可以创建另一个仅包含所需信息的对象。

fun toContactMessageChatItem(item: MessageWithMsgQueueAccount?, accountDto: AccountDto): MessageChatItem {

            item?.message?.let {
                // Procedure for creating the fields that i want

                val isQuoted = it.quotemsgid > 0L
                if (isQuoted) {
                    // Fetch quoted message body
                }
                return MessageChatItem(.....)
            } ?: run {
                return MessageChatItem(..........)
            }
    }

由于这是聊天,因此我要设置的一个字段是带引号的邮件正文。我所具有的“输入”是被引用的消息的messageId。因此,这意味着我必须在转换函数内再次查询我的Room DB。
我的方式就是这样

val isQuoted = it.quotemsgid > 0L
var quotedBody = ""
if (isQuoted) {
   // Fetch quoted message body
   viewModelScope.launch(Dispatchers.IO) {
   val quotedMessage = messagesRepository.getMessageByMessageId(it.quotemsgid)
   withContext(Dispatchers.Main) {
      quotedBody = quotedMessage.body
   }
}
}

没有特定的问题,但是有什么更好的方法可以执行类似的操作,这意味着在转换函数中查询数据库。有没有办法使我的元素或某些东西产生同步问题?

0 个答案:

没有答案