Android 基于用户获取数据';s查询并将其传递给数据绑定[使用MVVM]
我有一个数据库,里面有英制和公制的天气数据。现在,我创建了两个不同的类,它们充当从数据库获取数据的模型Android 基于用户获取数据';s查询并将其传递给数据绑定[使用MVVM],android,kotlin,mvvm,android-room,android-livedata,Android,Kotlin,Mvvm,Android Room,Android Livedata,我有一个数据库,里面有英制和公制的天气数据。现在,我创建了两个不同的类,它们充当从数据库获取数据的模型CurrentWeatherMetric仅包含公制列,CurrentWeatherImperial仅包含英制字段 由于我使用的是MVVM架构模式,ViewModel通过调用ViewModelgetData(Unit.METRIC)中的函数为我提供了这些数据,其中Unit是我用来区分数据的enum类 问题就出现在这里。 我的viewModel看起来像: class WeatherViewModel
CurrentWeatherMetric
仅包含公制列,CurrentWeatherImperial
仅包含英制字段
由于我使用的是MVVM架构模式,ViewModel
通过调用ViewModelgetData(Unit.METRIC)
中的函数为我提供了这些数据,其中Unit
是我用来区分数据的enum类
问题就出现在这里。
我的viewModel看起来像:
class WeatherViewModel(
private val weatherRepository: WeatherRepositoryImpl
) : ViewModel() {
lateinit var currentWeather: LiveData<CurrentWeather>
lateinit var forecastWeather: LiveData<List<ForecastWeather>>
fun getValuesOfUnit(unit: Unit) {
currentWeather = when (unit) {
Unit.IMPERIAL->weatherRepository.getCurrentWeatherImperial()
Unit.METRIC->weatherRepository.getCurrentWeatherMetric()
}
getWeather()
}
private fun getWeather() {
viewModelScope.launch {
try {
weatherRepository.getWeather()
} catch (e: IOException) {
}
}
}
}
我的观点是:
app:someattribute=“@{viewModel.currentWeather.temperature}”
如果问题标题对我的问题有点意义,或者看起来有误导性,请随意编辑,使其成为一个更好的问题。当使用MVVM架构模式时,谷歌推荐的方法是使ViewModel
处理数据和视图之间的连接,因此,它包含UI逻辑以及绑定到UI的部分业务逻辑
此外,以推荐的方式实现ViewModel
,有助于您更好、轻松地处理UI生命周期(活动/片段)
在MVVM中使用数据绑定时,最好将ViewModel
直接绑定到xml,这样,当数据更改时,您可以使用LiveData
直接将其反映到UI,而无需手动连接
因此,LiveData
可以用作数据值持有者,因为它也是生命周期感知组件
另一方面,存储库是管理业务逻辑和通过应用程序驱动数据的“单一真实来源”的好方法。因此,所有数据源,如本地数据库、API调用、共享首选项等,都应该通过存储库进行访问
所以,是的!!您所做的事情都是好的&您在遵循MVVM架构模式的同时走在了正确的轨道上
注意:您可以参考了解更多信息和代码中的一些改进
尽管采用了lateinit,但您也可以使用MutableLiveData
在声明的同一行初始化它,比如val data:LiveData=MutableLiveData()
。虽然UI绑定对我来说似乎还可以。所以我实现其余代码的方式还可以?是的,在我看来,遵循MVVM并从存储库获取数据是最佳实践。推荐的方法是将ViewModel绑定到UI并从存储库中获取数据,存储库始终是数据的唯一真实来源。好的,谢谢!如果你愿意写一个答案,我会把它标记为正确的,但我并没有帮助你获得这样的声誉。