Как сохранить в ROOM ограниченное количество элементов (20 штук)?

Я получаю массив элементов из сервера и сохраняю в БД Room. И при каждой загрузке она добавляет данные и БД расширяется. Мне нужно, что бы каждый раз когда загружались данные перезаписывали имеющиеся на БД данные. При чем лимит хранения БД должно быть 20. В @Entitiy я использовал длину url в качестве id

{
    @PrimaryKey(autoGenerate = false)
    var id = url?.length
}

и при конфликте перезаписывается (DAO):

   @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun saveArticles(quotes: List<ArticleEntity>)

Необходимо, лимитировать количество записываемых данных до 20 и каждый раз перезаписывать старые данные.


Ответы (1 шт):

Автор решения: Sergei Buvaka

Ну сам Room вам в этом не поможет.

Вам нужно написать свою прослойку которая будет этим заниматься. Я бы это сделал так:

Написал бы некий репозиторий который при каждом получении данных дергал бы уже имеющиеся элементы. Проверял их. После чего мержил бы по, нужной вам логике. И после этого записывал уже нужные вам данные в базу обратно.

Как это мержить это уже надо более конкретно смотреть на задачу. К примеру если вам всегда нужно хранить 20 последних данных то можно пойти по следующему алгоритму:

Получили данные из сервера

  • данных >= 20 -> просто очистили таблицу без проверок и записали новые 20.

  • данных < 20 -> вытащили из БД недостающее количество данных с конца (возможно тут еще стоит хранить timeStamp) смержили их с теми данными, что пришли с сервера и снова удалили бд и сохранили новые данные.

    Или как подсказали в комментах просто удалили n (недостающих элементов с конца/начала) и те что пришли с сервака записали в бд сверху.

→ Ссылка