我的应用程序具有以下顺序。 在数据库层中,我有返回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)
}
})
}
如您所见,查询需要一些参数(我从Intent获取它们)(serverId,siteId)。因此,在声明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尚未初始化
答案 0 :(得分:0)
我认为您的问题是试图获取Livedata对象。 Livedata是一个包装器!您应该从数据库中返回一个SiteDTO?对象,而不是Livedata,因为您会收到一个实例化的Livedata,其中包含一个非实例化的SiteDTO(这是您当前的错误)...建议您检查一下Google为kotlin提供的实时数据代码实验室(https://codelabs.developers.google.com/android-kotlin-fundamentals/)