Как сохранить в 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 шт):
Ну сам Room вам в этом не поможет.
Вам нужно написать свою прослойку которая будет этим заниматься. Я бы это сделал так:
Написал бы некий репозиторий который при каждом получении данных дергал бы уже имеющиеся элементы. Проверял их. После чего мержил бы по, нужной вам логике. И после этого записывал уже нужные вам данные в базу обратно.
Как это мержить это уже надо более конкретно смотреть на задачу. К примеру если вам всегда нужно хранить 20 последних данных то можно пойти по следующему алгоритму:
Получили данные из сервера
данных >= 20 -> просто очистили таблицу без проверок и записали новые 20.
данных < 20 -> вытащили из БД недостающее количество данных с конца (возможно тут еще стоит хранить timeStamp) смержили их с теми данными, что пришли с сервера и снова удалили бд и сохранили новые данные.
Или как подсказали в комментах просто удалили n (недостающих элементов с конца/начала) и те что пришли с сервака записали в бд сверху.