这是一个棘手的问题。
我有一个来自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
}
}
}
没有特定的问题,但是有什么更好的方法可以执行类似的操作,这意味着在转换函数中查询数据库。有没有办法使我的元素或某些东西产生同步问题?