我的应用程序有以下序列。在数据库层中,我有一个返回LiveData 的查询
@Query("Select * from sites where server_id = :serverId and site_id = :siteId")
fun getSite(serverId: Long, siteId: Int): LiveData<SiteDto>
在我的存储库中,我有一个函数可以返回查询
override fun retrieveSite(serverId: Long, siteId: Int): LiveData<SiteDto> {
return sitesDao.getSite(serverId, siteId)
}
在我的活动中,我观察SiteDto,以便显示有关它的一些信息但只有在某些条件下,这来自于活动的意图。所以
if(condtion) {
myViewModel.getSite().observe(this, Observer {
it?.let {
println(it.description)
}
})
}
正如您所看到的,查询需要一些参数(serverId、siteId(,这些参数是我从Intent中获得的。因此,在我声明myViewModel之后,我将函数setArguments(…(中的参数传递给viewModel。(我可以使用ViewModelFactory,但参数并不总是一样……所以忘了它吧(
所以问题是,在我得到参数后,我应该如何从ViewModel中的存储库中获取网站
private lateinit var _siteDto: LiveData<SiteDto>
fun setArguments(....) {
_siteDto = accountsRepository.retrieveSite(serverId, siteId)
}
fun getSite(): LiveData<SiteDto> {
return _siteDto
}
当我运行它时,我得到以下错误
kotlin.UninitializedPropertyAccessException:lateinit属性siteDto尚未初始化
我认为您的问题是试图获取Livedata对象。Livedata是一个包装!您应该从数据库返回SiteDTO吗?对象,而不是Livedata,因为您将收到一个内部有非实例化SiteDTO的实例化Livedata(这是您当前的错误(。。。我建议你查看谷歌为kotlin提供的实时数据代码实验室(https://codelabs.developers.google.com/android-kotlin-fundamentals/)