Как запросить данные в реальном времени в зависимости от аргумента с Android Room? - PullRequest
0 голосов
/ 28 декабря 2018

Я работаю над приложением для Android, где пользователи могут сохранять блюда и их количество в соответствии с определенной датой.В настоящее время время хранится в виде строки yyyy-mm-dd в базе данных SQLite (возможно, позже я изменю тип данных).Пользователь может выбрать дату на CalendarView, а RecylerView должна просто отображать блюда на выбранную дату.Я не хочу получить все строки, а просто запросить строки в зависимости от даты.Я использую Room Persistence Library .

Как мне этого добиться?

Я использую LiveData<List<MYOBJECT>> и соответствующий Observable Listener:

final MyViewModel myViewModel = ViewModelProviders.of(this).get(MyViewModel.class); 
String myDate = getDateFromCalendarView();    

myViewModel.getMealsOnDate(myDate).observe(this, new Observer<List<MYOBJECT>>() {
        @Override
        public void onChanged(@Nullable List<MYOBJECT> myObjects) {
            adapter.setItems(myObjects); // adapter from RecyclerView
        }
    });

Это запрос в моем интерфейсе DAO:

@Query("SELECT * FROM meals WHERE meals_date = :date")
LiveData<List<MYOBJECT>> getMealsOnDate(String date);

В настоящий момент Обозреватель не реагирует на другое значение в myDate, поэтому я не могу запрашивать другие строки из моей базы данных.

Возможно ли это вообще, или мне нужно придерживаться запроса всей таблицы и затем выбирать данные из моего List<MYOBJECT?

1 Ответ

0 голосов
/ 28 декабря 2018

Вместо создания списка observable создайте myDate переменную observable.Потому что это дата, которая меняется, а не список.Вы можете достичь этого:

Сделайте ваш myDate как MutabeLiveData в viewModel.Затем вы можете изменить его значение, когда дата выбрана из CalenderView, используя setValue(newDate).

Теперь, наблюдайте за этим myDate, и при изменении значения извлекайте список со значением даты обновления и обновляйте RecyclerView.

Также используйте TimeStamp вместо сохранения даты в виде yyyy-mm-dd String.

*********** UPDATE *************

Пример для дальнейшего уточнения

В ViewModel классе сделать это

MutableLiveData<String>() myDate=new MutableLiveData<String>();

В Activityсделайте это:

calendarView.setOnDateChangeListener( new CalendarView.OnDateChangeListener() {
public void onSelectedDayChange(CalendarView view, int year, int month, int dayOfMonth) {
   myViewModel.myDate.setValue(""+year+"-"+month+"-"+dayOfMonth);//This will invoke the observer
}});

myViewModel.myDate.observe(this, new Observer<String>() {
        @Override
        public void onChanged(@Nullable String newDate) {
           //do this on dedicated thread
           List<MYOBJECT> myObjects=myViewModel.getMealsOnDate(newDate)
           adapter.setItems(myObjects); // adapter from RecyclerView
        }
    });

Примечание : 1. Не нужно указывать getMealsOnDate() как LiveData.Метод в Dao может возвращать List<MYOBJECT> вместо LiveData<List<MYOBJECT>>. Так что вам не нужно его соблюдать.

2. Не запускайте запросы db в основном потоке, а вызывайте notifyDataSetChanged в setItems() адаптера для обновления Recyclerview.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...