我正在使用Room构建一个android应用程序,用于数据持久性和LiveData。
我有多个片段和viewModel。
当我启动应用程序并登录MainActivityView时,我也会打电话检索用户信息并将其保存在房间数据库中。这很好用。
然后,当我访问用户配置文件片段时,我希望看到显示的用户信息,但什么都没有显示。数据在数据库中,但UI似乎没有刷新。
在我的用户档案片段中,我这样做:
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
viewModel.getUserInfo().observe(viewLifecycleOwner, object: Observer<UserProfileResp?> {
override fun onChanged(t: UserProfileResp?) {
getName(t?.firstName, t?.lastName)?.let {
binding.userEt.apply {
setText(it)
showTopText()
}
}
getUserInfo在我的UserProfileViewModel中定义如下:
fun getUserInfo(): MutableLiveData<UserProfileResp?> = appRepository.getUserInfo()
AppRepository为:
override fun getUserInfo(): MutableLiveData<UserProfileResp?> = userInformationDb.getUserInfo()
并且对Db的调用为:
@Query("SELECT userinfo from usertable WHERE username='USER'") fun getUserInfo(): MutableLiveData<UserProfileResp?>
我还创建了setUserInfo
,但在加载MainActivity时会在代码的早期调用它。目标是让mainActivity或我的主页片段通过它们的viewModel请求UserInformation并将其保存在Db中。这是有效的,但在剖面碎片中观察似乎根本不起作用。
知道吗?
我可以看看你的UserProfileResponse
课程吗?这可能是因为UserProfileResponse
类中有firstName
、lastName
字段,但在SQL代码中,您并没有尝试获取这些字段。
您应该编写SELECT * ...
或您想要接收的所有字段,而不是SELECT userinfo ....
。下面的快速示例:
@Query("SELECT * from usertable WHERE username='USER'") fun getUserInfo(): MutableLiveData<UserProfileResp?>
另请注意:请确保您的用户的用户名。因为WHERE
不区分大小写。如果要保存用户名,最好在保存数据和获取数据时将其全部小写。