LiveData、Room 持久性 Ui 未更新

LiveData, Room persistant Ui is not updated

我正在构建一个 android 应用程序,使用 Room 实现数据持久化和 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 中。哪个有效,但似乎在配置文件碎片中观察根本不起作用。

有什么想法吗?

我可以看看你的UserProfileResponseclass吗? 这可能是因为您在 UserProfileResponse class 上有 firstNamelastName 字段,但是在您的 SQL 代码中,您并没有尝试获取这些字段。

而不是 SELECT userinfo ....,您应该写 SELECT * ... 或您希望接收的所有字段。 下面的快速示例:

@Query("SELECT * from usertable WHERE username='USER'") fun getUserInfo(): MutableLiveData<UserProfileResp?>

另请注意:确保您的用户名。因为 WHERE 不区分大小写。如果要保存用户名,最好在保存数据和获取数据时全部小写。