我正在开发一个应用程序。 有一个问题。
我有一个屏幕显示主题列表。 我想组合显示不同的数据。一是主题实体,二是您思考该主题的次数。
但是...我不知道...我怎样才能得到这个?
我想到了一种方法,请检查下面的代码。
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
请看下面的图片,这是我想要的。
正如所讨论的,这些问题通常可以通过稍微复杂一点的 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>