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
通过调用ViewModel
getData(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并从存储库中获取数据,存储库始终是数据的唯一真实来源。好的,谢谢!如果你愿意写一个答案,我会把它标记为正确的,但我并没有帮助你获得这样的声誉。