如何在android中将不同的数据组合到流中?

问题描述 投票:0回答:1

我正在开发一个应用程序。 有一个问题。

我有一个屏幕显示主题列表。 我想组合显示不同的数据。一是主题实体,二是您思考该主题的次数。

但是...我不知道...我怎样才能得到这个?

我想到了一种方法,请检查下面的代码。

CoroutineScope(Dispatchers.IO).launch {
            topicRepository.getTopicList()
                .onStart {
                    _topicListUiState.value = TopicListUiState.Loading
                }
                .catch { exception ->
                    _topicListUiState.value = TopicListUiState.Failed(TAG_TOPIC_LIST_PRESENTER, exception.localizedMessage)
                }
                .collectLatest { topicList ->
                    topicList.forEach { topic ->
                        thinkRepository.getCountOfThinkListByTopicId(topic.id)
                            .collect { count ->
                                _topicListUiState.value = TopicListUiState.Success(topicList.map { it.toTopicListDTO(count.toInt()) })
                            }
                    }
                }
        }

我想知道是否有更好的方法。 另外,请给我一些建议,我应该多学习什么领域。

感谢您的阅读! 祝你有美好的一天!


共有三个数据类TopicListDTO、Topic Entity、Think Entity。
我想显示 TopicListDTO 的列表,它结合了 Topic 和 Think。
我创建 TopicListDTO 只是为了显示组合的两个内容。

data class TopicListDTO(
    val id: Long,
    val topic: String,
    val countOfThink: Int = 0,
    val registDate: String,
    val updateDate: String
)

@Entity(tableName = "topics")
data class Topic(
    @PrimaryKey
    val id: Long = System.currentTimeMillis(),
    val topic: String,
    val registDate: String,
    val updateDate: String
) {
    fun toTopicListDTO(count: Int): TopicListDTO {
        return TopicListDTO(
            id = id,
            topic = topic,
            countOfThink = count,
            registDate = registDate,
            updateDate = updateDate
        )
    }
}

@Entity(
    tableName = "thinks",
    foreignKeys = [
        ForeignKey(
            entity = Topic::class,
            parentColumns = ["id"],
            childColumns = ["topicId"],
            onDelete = CASCADE,
            onUpdate = CASCADE
        )
    ]
)
data class Think(
    @PrimaryKey
    val id: Long = System.currentTimeMillis(),
    val topicId: Long,
    val think: String,
    val registDate: String,
    val updateDate: String
)

在检查了@TheLibrarian的建议后,我尝试了SQL查询。 但我没有...

SELECT * FROM topics LEFT OUTER JOIN thinks on topics.id = thinks.topicId

请看下面的图片,这是我想要的。

enter image description here

android kotlin coroutine
1个回答
0
投票

正如所讨论的,这些问题通常可以通过稍微复杂一点的 SQL 查询来修复。

这种方式发出的变化是在

Room
一侧处理的,你不必处理它们。

您的

LEFT JOIN
走在正确的轨道上 - 查询将如下所示:

SELECT Topics.Id, Topics.Topic, Topics.RegistDate, COUNT(TopicId) AS topicCount
FROM Topics
LEFT JOIN Thinks ON Topics.Id=Thinks.TopicId
GROUP BY Topics.Id;

从 Room 2.4 及更高版本开始,还有 @MapInfo(MapColumn) -

TopicListDTO
不需要,至少对于这种情况不需要:

@Query("
SELECT Topics.Id, Topics.Topic, Topics.RegistDate, COUNT(TopicId) AS topicCount
FROM Topics
LEFT JOIN Thinks ON Topics.Id=Thinks.TopicId
GROUP BY Topics.Id
")
fun getTopics(): Map<Topic, @MapColumn(columnName = "topicCount") Integer>
© www.soinside.com 2019 - 2024. All rights reserved.