Почему onChanged не запускается во второй раз, когда я вызываю Dao.findBy (friendId) (после вызова Dao.findBy (-1))
В вашем репозитории вы инициализируете перехватчик вашей базы данных с id = -1L
. Теперь вы будете получать обновления только для сущностей с id = -1. И поля ID почти всегда - это ROWID баз данных, которые никогда не бывают отрицательными.
РЕШЕНИЕ: Теперь, как я понял из вашего вопроса, у вас будет одна и только одна запись в вашей таблице DBase. Это означает, что ожидаемое значение не зависит (и, следовательно, не может ) ни от какого параметра. Это просто реализовать:
Поскольку у вас будет только одна запись, которая не может зависеть ни от одного параметра, вам фактически не нужны никакие параметры для вашей функции findBy(long id)
. Просто удалите из запроса предложение WHERE :
@Query("SELECT * FROM friend_table LIMIT 1")
LiveData<FriendEntity> findBy();
Проблема с MutableLiveData заключается в том, что изменения в БД нельзя наблюдать напрямую Поскольку вы не предоставили реализации, я не могу догадаться, в чем может быть проблема. Однако это не должно вызывать проблем с правильной реализацией.
EDIT После получения отзыва о требовании правильный способ реализации:
- Dao :
@Dao
public interface MyDao {
@Query("SELECT * FROM friend_table WHERE id=:id LIMIT 1")
LiveData<FriendEntity> findBy(long id);
}
Репозиторий: не нужен метод
find (long id) . Измените способ предоставления
LiveData . Как и в моем предыдущем ответе, не инициализируйте его с помощью
id = -1L .
public LiveData<FriendEntity> getFriendById(long id) {
if(id != foundFriend.getId()) {
//Background thread is not necessary for @Query annotated methods,
//as Room framework handles those by itself
foundFriend = dao.findBy(id);
}
return foundFriend;
}
ViewModel:
Этот шаг не является строго необходимым, но рекомендуется не предоставлять данные из репозитория непосредственно представлениям. И поскольку ваши результаты зависят от параметра id , используйте Transformations API, а именно: Transformations.switchMap () : https://developer.android.com/reference/androidx/lifecycle/Transformations (Я настоятельно рекомендую вам изучить и использовать этот API вместе с LiveData, где это применимо). Activity, Fragment et c) только один раз и может вызывать метод viewmodel updateFriend (long id) из вашего представления, когда вам требуется новый FriendEntity.