首页 > 解决方案 > 从 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 之外,一切正常。

标签: androidkotlinandroid-roomandroid-livedataandroid-workmanager

解决方案


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 注释。防止多次创建房间数据库实例。


推荐阅读