【问题标题】:Insert on Room DB does not trigger Observer on Activity在 Room DB 上插入不会触发活动上的观察者
【发布时间】:2020-03-08 16:01:37
【问题描述】:

在我的活动中,我有一个观察此查询的观察者

@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 objerver 触发,我在屏幕上看到了消息

在我想发送图像之前一切正常。为了做到这一点,我有一个在工作管理器中创建消息和消息队列的过程。但是当我做同样的事情(保存到消息然后保存到消息队列)时,我的观察者不会被触发。

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 和我的存储库声明为单例。

有人知道这里发生了什么吗??

【问题讨论】:

    标签: android android-room android-livedata android-workmanager


    【解决方案1】:

    最后我的问题是 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())
    

    问题解决了...!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 2016-02-07
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      相关资源
      最近更新 更多