Я пишу сообщение в свою базу данных комнаты, чтобы затем отправить его на сервер, когда это будет успешно, я обновляю сообщение в базе данных.
Когда я пробую это от рабочего (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
}
Вне воркера все работает нормально.
Не совсем уверен, в чем проблема, но теперь он работает.
Я сейчас ввожу все (базу данных и службы) в свой рабочий, возможно, это помогло (не уверен, имеет ли это значение, если я использую тот же экземпляр своей базы данных).
Room.databaseBuilder(application, Database::class.java,"dbname")
.allowMainThreadQueries()
.enableMultiInstanceInvalidation() // maybe room database create multi instance. add this line solved my problem
.fallbackToDestructiveMigration()
.build()
проблема заключалась в том, что экземпляр базы данных комнаты создавался более одного раза. просто попробуйте добавить эту строку. все созданные экземпляры базы данных комнат могут быть отслежены и сделать источник данных недействительным при внесении изменений.
.enableMultiInstanceInvalidation()
другое решение, я использую кинжал (внедрение зависимостей) и добавляю аннотацию @Singleton в функции предоставления экземпляра базы данных комнаты. для предотвращения создания экземпляра базы данных комнаты более одного раза.
Вам нужно детализировать ответ
У меня такая же проблема. Вот ссылка на него. (stackoverflow.com/questions/60589304/…). Есть ли способ помочь мне, если вы нашли решение? Спасибо