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 中。哪个有效,但似乎在配置文件碎片中观察根本不起作用。
有什么想法吗?
我可以看看你的UserProfileResponse
class吗?
这可能是因为您在 UserProfileResponse
class 上有 firstName
、lastName
字段,但是在您的 SQL 代码中,您并没有尝试获取这些字段。
而不是 SELECT userinfo ....
,您应该写 SELECT * ...
或您希望接收的所有字段。
下面的快速示例:
@Query("SELECT * from usertable WHERE username='USER'") fun getUserInfo(): MutableLiveData<UserProfileResp?>
另请注意:确保您的用户名。因为 WHERE
不区分大小写。如果要保存用户名,最好在保存数据和获取数据时全部小写。
我正在构建一个 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 中。哪个有效,但似乎在配置文件碎片中观察根本不起作用。
有什么想法吗?
我可以看看你的UserProfileResponse
class吗?
这可能是因为您在 UserProfileResponse
class 上有 firstName
、lastName
字段,但是在您的 SQL 代码中,您并没有尝试获取这些字段。
而不是 SELECT userinfo ....
,您应该写 SELECT * ...
或您希望接收的所有字段。
下面的快速示例:
@Query("SELECT * from usertable WHERE username='USER'") fun getUserInfo(): MutableLiveData<UserProfileResp?>
另请注意:确保您的用户名。因为 WHERE
不区分大小写。如果要保存用户名,最好在保存数据和获取数据时全部小写。