Я заметил странное поведение из библиотеки комнат Android (по крайней мере, для меня это выглядит странно).
Хотя есть другие сообщения с похожими проблемами, ни одна из них (чтоЯ мог бы найти), это почти то же самое.
Моя проблема в том, что когда я наблюдаю объект LiveData
, метод onChange()
моих наблюдателей вызывается несколько раз, но только для операции INSERT.Метод будет запускаться один раз для каждого вставляемого объекта (т. Е. Если я вставлю список из N объектов, он будет активирован N раз), тогда как для других операций (например, DELETE) он запускается один раз, независимо от размера списка.Я удаляю.
У меня есть следующие запросы в моем DAO:
@query("select * from myTable")
LiveData<myEntity> getAll();
@insert
void insert(List<myEntity> entities);
@delete
void delete(List<myEntity> entities);
Я наблюдаю метод getAll()
, и я определенно вызываю методы delete()
и insert()
один раз - как-то так:
public void insertAll(List<myEntity> items)
{
myDao.insert(items);
}
и
public void deleteAll(List<myEntity> items)
{
myDao.delete(items);
}
Так как в моем методе onChange()
я обновляю адаптер RecyclerView
, который виден пользователю, этопроблема в том, что я получаю много дубликатов, а также делаю какие-то другие вещи, которые нужно делать только один раз при каждом изменении таблицы, но вместо этого они выполняются много раз (как я уже говорил, один раз для каждого элемента).вставлен).
Я прочитал эту статью и попытался реализовать совет № 7, но проблема сохраняется.https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1
Это задумано и считается нормальным поведением?Что я могу сделать, чтобы мой наблюдатель срабатывал только один раз для каждой операции INSERT (даже если я вставляю несколько объектов одновременно)?