Непреднамеренно вызванный слушатель изменений области - PullRequest
0 голосов
/ 14 января 2019

В основном у меня есть две модели: чат и сообщение. Чат содержит поле типа RealmList со всеми сообщениями, относящимися к соответствующему Чату. Моя проблема: когда я пытаюсь добавить сообщение «а» (которое уже существует внутри области) в чат «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 голосов
/ 16 января 2019

так что на случай, если кто-нибудь столкнется с этим, я действительно выяснил проблему.

Проблема

В моем классе сообщений есть поле чата типа chat. Из-за этого возникли круговые отношения.

Позвольте мне объяснить:

  • У нас есть чат chatA.
  • У нас есть сообщение messageA -> Уже сохранено в Message-Table, но еще не добавлено в chatA.

Добавляем сообщение A в чатA:

  • Технически, каждое сообщение, которое принадлежит chatA, изменяется, потому что:
    • В ChatA есть список сообщений, которые только что изменились, потому что мы добавили новое сообщение -> поэтому chatA изменилось
    • chatA (который находится внутри большого количества сообщений) уведомляет сообщения о том, что свойство внутри них изменилось
    • наконец, вызывается realmChangeListener

Мое решение:

Я просто заменил поле чата типа Чат внутри сообщения на Длинное поле chatId. Я знаю, что это не очень хорошее решение. Не стесняйтесь предложить лучший вариант.

0 голосов
/ 15 января 2019

Я открыл вопрос на github и получил ответы: https://github.com/realm/realm-java/issues/6401

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...