我目前正在使用Room存储单词翻译的列表,并以LiveData的形式返回查询以监视插入和更新。但是,当我需要重新获取另一种源语言的翻译时遇到了问题(我目前的策略是将实时数据重新分配给会议室查询的结果)。
我使用以下SQL查询获取要翻译的语言以及针对特定语言的翻译
@Dao
interface TranslationDatabaseDao {
...
//Returns all pairs of languages to translate to/from
@Query("SELECT * FROM language_pairs")
fun getAllLanguagePairs(): LiveData<List<LanguagePair>>
//Returns translations with the specified source language
@Query("SELECT * FROM translations WHERE sourceLanguage = :language")
fun getTranslations(language: String): LiveData<List<TranslationResult>>
...
}
在实例化视图模型时调用,在用户更改语言时再次调用(请参见下面的changeLanguage(...)
)。
class translationViewmodel(private val database: TranslationDatabaseDao, initLanguage: String): ViewModel() {
...
val languages: LiveData<List<LanguagePair>> = database.getAllLanguagePairs()
val currentLanguages = Transformations.map(languages) { allLanguages ->
allLanguages?.let {
it[0] //Get the first language in the list
}
}
var translations: LiveData<List<TranslationResult>> = database.getTranslations(initLanguage)
...
fun changeLanguage(language: String) {
coroutinesScope.launch {
translations = withContext(Dispatchers.IO) {
database.getTranslations(language)
}
}
}
...
}
重新分配翻译列表会导致观察实时数据的片段继续观察旧的实时数据,因此我的策略是删除观察者,并在更改语言时将其重新分配到片段中。这似乎不是最好的解决方案,我也不确定在删除先前的观察者并重新创建之前如何确保数据已加载(我正在使用协程,因此我需要一种回调方法返回实时数据时)。
所以我的问题是:在更改语言之后,是否有更好的方法重新分配实时数据?或者更确切地说,是否存在使片段了解此重新分配的可接受方法?
答案 0 :(得分:1)
您可以为该语言再创建一个LiveData
,然后使用switchMap将其映射到翻译,例如:
class translationViewmodel(private val database: TranslationDatabaseDao, initLanguage: String): ViewModel() {
val language = MutableLiveData<String>("en")
val translations = language.switchMap { language ->
database.getTranslations(language)
}
...
}
现在,只需更改语言,翻译内容也会更新
viewmodel.language.value = "es"