在Room DB上插入不会触发Activity上的Observer

问题描述 投票:0回答:1

在我的活动中,我有一个观察者,可以观察该查询

@Query("""Select *,
        (Select account_id from accounts where account_id = from_account_id) as contact_account_id,
        (Select first_name from accounts where account_id = from_account_id) as  contact_first_name,
        (Select last_name from accounts where account_id = from_account_id) as  contact_last_name
        from messages inner join messageQueue on messages.client_message_id = messagequeue.client_message_id
        where ((msg_type = 1 and body <> "") or msg_type <> 1)
        order by message_date desc
    """)
    fun getChatRoomGroupMessages(): DataSource.Factory<Int, ChatMessageItem>

ChatItem是2个表的关系

@Embedded
    var message: MessageDto? = null

    @Relation(parentColumn = "client_message_id", entityColumn = "client_message_id", entity = MessageQueueDto::class)
    var messageQueue: MessageQueueDto? = null

'client_message_id'是表消息的主键及其自动递增。

[当我想'发送'一条消息时,我在消息中创建一个条目,得到插入返回的client_message_id,将其设置为messageQueue并在其中创建一个条目,以便我可以拥有该关系。

viewModelScope.launch(Dispatchers.IO) {
            val clientMessageIdList = insertMessages(messageDtoList)
            for (i in clientMessageIdList.indices) {
                messageQueueDtoList[i].clientMessageId = clientMessageIdList[i]
            }
            insertMessageQueues(messageQueueDtoList)
}

当对象插入数据库时​​,LiveData对象触发,并且我在屏幕上看到消息

一切正常,直到我要发送图像。为了做到这一点,我有一个在工作经理内部创建消息和消息队列的过程。但是,当我做同样的事情时(先保存到消息中,然后再保存到消息队列中),则不会触发我的观察者。

class FileStorage @AssistedInject constructor(
    @Assisted private val appContext: Context,
    @Assisted private val params: WorkerParameters,
    private val messagesRepository: MessagesRepository
) : CoroutineWorker(appContext, params) {
             ................
      val headerClientMessageId =
            messagesRepository.insertMessages(headerFileMessagesArray)
        for (i in headerClientMessageId.indices)
            headerFileMessageQueuesArray[i].clientMessageId =
                headerClientMessageId[i]

        messagesRepository.insertMessageQueues(headerFileMessageQueuesArray)
}

我进行新插入后,就会看到以前的插入物和新插入物。我使用Dagger2进行注入,并且已经将我的数据库,Daos和我的存储库声明为Singletons。

有人知道这里发生的事情吗?

android android-room android-livedata android-workmanager
1个回答
0
投票

最后,我的问题是使用Dagger注射。在我的应用程序类中,我设置了两个AppDaggerComponent实例,并将它们注入到应用程序和WorkManager中。

// Before
        DaggerAppComponent.factory().withContext(this).inject(this)

        val factory: AppWorkerFactory = DaggerAppComponent.factory().withContext(this).workerFactory()
        WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(factory).build())

// After
        val daggerAppComponent = DaggerAppComponent.factory().withContext(this)
        daggerAppComponent.inject(this)

        val factory: AppWorkerFactory = daggerAppComponent.workerFactory()
        WorkManager.initialize(this, Configuration.Builder().setWorkerFactory(factory).build())

问题已解决... !!

© www.soinside.com 2019 - 2024. All rights reserved.