Библиотека подкачки Android: как показать связанный элемент, если его еще нет в локальной базе данных, и не прерывать подкачку?

#android #kotlin #android-room #android-paging

#Android #kotlin #android-room #android-подкачка

Вопрос:

Я пишу приложение для чата. Сообщения загружаются по страницам (элемент с ключом — message_id) с использованием библиотеки подкачки Android. Также есть функция «ответить», которая означает, что пользователи могут отвечать на любое сообщение в чате. В RecyclerView это должно выглядеть так:

 Part of message which was replied...
------------------------------------
Main message text
  

Это просто, когда связанное сообщение уже есть в локальной базе данных. Я могу извлечь все данные из базы данных и показать их в приложении. Но могут быть ситуации, когда ответного сообщения НЕТ в локальной базе данных (например, это старое сообщение, и мы только что установили приложение — база данных пуста). И сообщение выглядит плохо, пока ответное сообщение не будет сохранено в локальной базе данных:

 
------------------------------------
Main message text
  

Что я пробовал: если свойство reply_to сообщения не равно null, я загружаю ответное сообщение с удаленного сервера по этому идентификатору и сохраняю его в локальной базе данных. Комната реагирует на изменения и нормально отображает все содержимое. Но это ответное сообщение становится последним в моем массиве сообщений, и BoundaryCallback загружает сообщения после этого ответного сообщения, пропуская сообщения между РЕАЛЬНЫМ последним сообщением и этим ответным сообщением.

Например, у меня есть сообщения с идентификаторами 1 .. 100.

 (boundary callback makes initialLoad, say 20 items)
1 message
2 message
..
10 message with reply to 50 message (load message 50 and store it in db)
11 message
..
(early loaded messages)
..
20 message
(this should be end, but this is not because of 50 message which is stored in local database now)
50 message
(bounary callback makes loadAfter new items by key - message id)
51 message
..
  

Итак, мы потеряли часть сообщений с 21 по 49.

Объект комнаты сообщений обладает следующими свойствами:

 @Entity
class Message {
    var id: Int
    var text: String
    var reply_to: Int?
}
  

MessageModel возвращается Room by relation и используется в PagedAdapter

 class MessageModel {
    var message: Message
    var repliedMessage: Message
}
  

Как я могу показать ответное сообщение и не прерывать подкачку?
Как это должно быть сделано правильно?

Ответ №1:

Я нашел решение. В моем случае я создал дополнительную таблицу RepliedMessage (которая является абсолютной копией сообщения), и я сохраняю ответные сообщения в этой таблице. Разбивка на страницы работает отлично. Нам нужно только обновлять RepliedMessages.