1

我正在向我的 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 之外,一切正常。

4

2 回答 2

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

于 2020-09-03T15:06:06.463 回答
0

不完全确定问题是什么,但它现在工作。

我现在将所有内容(数据库和服务)注入我的工作人员,也许这有帮助(不确定如果我使用我的数据库的相同实例是否会有所不同)。

于 2018-07-11T11:33:41.263 回答