领域变更侦听器意外调用

时间:2019-01-14 19:44:46

标签: android realm

基本上,我有两个模型,聊天和消息。聊天包含RealmList类型的字段,其中包含属于相应聊天的所有消息。我的问题:当我尝试将消息“ a”(已经存在于领域中)添加到聊天室“ b”(->代码)时,将调用RealmChangeListener。 RealmChangeListener正在侦听整个消息表。用更改数组调用OrderedCollectionChangeSet,这些更改包含聊天室“ b”内的消息字段中包含的所有消息。我的问题是,这是否是故意的,为什么会这样?

我试图通过注释不同的行来查找问题。但是最后,当我向聊天中添加消息时,始终会调用ChangeListener。

class Chat {
    ...
    val messages: RealmList<Message> = RealmList()
    ...
}

realm.executeTransaction {
    newMessage = realm.copyToRealm(aMessage)
    chat.messages.add(newMessage)
}

allMessage.addChangeListener { messages: RealmResults<Message>, 
    changes: OrderedCollectionChangeSet? -> 
    //Always invoked when above transaction runs
    //changes contains changes-Array with all Messages from above 
    chat
}

class Message {
    @PrimaryKey
    var id: String = UUID.randomUUID().toString() + System.currentTimeMillis()
    var messageId: Long = System.currentTimeMillis()
    var messageContent: FlatMessage? = null
    var user: User? = null
    var createdAt: Long = System.currentTimeMillis()
    var updatedAt: Long = System.currentTimeMillis()
    var chat: Chat? = null
    var isNew: Boolean = false
    var isEdited: Boolean = false
    var insertDate: Date = Date()
    var isBotMessage: Boolean = false
}

我希望仅在将消息添加到消息表时才调用changeListener,而不是在将现有消息添加到聊天的RealmList字段中时调用。

2 个答案:

答案 0 :(得分:1)

我在github上打开了一个问题,并得到了答案:https://github.com/realm/realm-java/issues/6401

答案 1 :(得分:1)

因此,如果有人遇到这个问题,我实际上已经解决了问题。

问题

我的消息类别具有chat类型的现场聊天。因此,存在一种循环关系。

让我解释一下:

  • 我们有一个聊天chatA。
  • 我们有一条消息messageA->已保留在消息表中,但尚未添加到chatA中。

我们将messageA添加到chatA:

  • 技术上,属于chatA的每条消息都会更改,原因是:
    • chatA的邮件列表刚刚更改,因为我们添加了新邮件->因此chatA更改了
    • chatA(包含在许多消息中)通知消息它们中的属性已更改
    • 最后,realmChangeListener被调用

我的解决方案:

我只是将Message内部的Chat类型的Chat字段替换为Long字段chatId。我知道这不是一个很好的解决方案。随时提出更好的建议。