我正在从房间数据库中提取数据,函数返回我需要的数据,它会在惰性列中显示几秒钟,然后变为空白。
class TrainViewModel(private val cRepository: CRepository) : ViewModel() {
private val _trainList = MutableStateFlow<List<TrnTable>>(emptyList())
val trainList: StateFlow<List<TrnTable>> get() = _trainList
fun loadTrains() {
viewModelScope.launch {
cRepository.getAllTrains().collect { trains ->
_trainList.value = trains
}
}
}
}
在 LazyColumn 中显示它
@Composable
fun TrainListScreen(viewModel: TrainViewModel) {
val trainList by viewModel.trainList.collectAsState()
Column {
Button(onClick = { viewModel.loadTrains() }) {
Text("Load Trains")
}
LazyColumn {
items(trainList) { train ->
Text(text = train.name)
}
}
}
}
但是当我使用这种方法时,可以正确检索数据。
val allTrains: Flow<List<TrnTable>> = cRepository.getAllTrains()
但我有大约 12k 列火车,哪种方法更有效?
存储库-
fun getAllTrains(): Flow<List<TrnTable>> {
return trainDao.getTrains()
}
DAO-
@Query("SELECT * FROM Trn")
abstract fun getTrains(): Flow<List<TrnTable>>
实体-
@Entity("Trn")
data class TrnTable(
@PrimaryKey
val number:String="",
val name:String="",
val fromStnCode:String="",
val fromStnName:String="",
val toStnCode:String="",
val toStnName:String="",)
您似乎已经为自己找到了解决方案。为了更明确:不要在视图模型中收集流。使用这个代替:
这与数据库中有多少条目无关。它的作用与您之前的代码相同,但是以正确的方式进行。谈论正确的:您应该在可组合项中使用
collectAsStateWithLifecycle
而不是collectAsState
.您问题的其余部分似乎与一次性加载所有条目时的性能和/或内存占用有关。不过, 12k 的类型条目
TrnTable
对我来说似乎并不算太多。您始终可以对数据进行分页,这样您就只能选择部分条目,但由于这更复杂并且会产生开销,因此只有当您有强有力的迹象表明这实际上是一个需要解决的问题时,我才会这样做。不要陷入过早优化的陷阱。