android - 从 Worker 更改 Db 时 LiveData 未更新
问题描述
我正在向我的 Room db 写一条消息,然后在成功时将其发送到服务器我更新数据库中的消息。
当我从 Worker (WorkManager) 尝试此操作时,即使消息被写入数据库,保存消息的 LiveData 也不会更新。
小例子(插入不会更新 LiveData,但当我重新启动应用程序时会显示消息):
override fun doWork(): Result {
appDatabase = appDatabase(applicationContext)
val messageId = inputData.getString("messageId", "") ?: ""
val message = appDatabase.messageDao().getMessage(messageId)
appDatabase.messageDao().insertMessage(Message(message.conversationId, "XYZ 234234234234", "test", "test", SimpleDateFormat("yyyy-MM-dd-HH-mm-ss", Locale.GERMANY).format(Date()), false))
return Result.SUCCESS
}
在 Worker 之外,一切正常。
解决方案
Room.databaseBuilder(application, Database::class.java,"dbname")
.allowMainThreadQueries()
.enableMultiInstanceInvalidation() // maybe room database create multi instance. add this line solved my problem
.fallbackToDestructiveMigration()
.build()
问题是房间数据库实例创建了不止一次。试试添加这一行。如果有修改,所有已创建的房间数据库实例都可以被跟踪并使数据源无效。
.enableMultiInstanceInvalidation()
另一种解决方案,我使用 dagger(依赖注入)并在提供房间数据库实例的功能时添加 @Singleton 注释。防止多次创建房间数据库实例。
推荐阅读
- python - 循环遍历字符串python中的json数组
- amazon-cloudformation - 如何在 AWS codestar 中设置环境属性?
- c# - C# WPF - 自定义控件拖放(Visual Studio 风格)
- go - 通过导入父目录,使用 golang 导入子包?
- laravel - Laravel sortBy()无法对集合进行排序
- git - 使用 Git,让人们看到同一项目的不同版本的最佳方式是什么?
- c# - Linq 语句查询,可能的组
- javascript - Wordpress 中的滑块
- javascript - 如何在 django 中单击按钮时添加更多表单小部件?
- c - 在 C 中使用 getopt 检测没有选项(在 Linux 中)