Я новичок в использовании функциональности комнаты, и я установил свой Dao со следующими
public interface ValleyDao {
@Query("SELECT * FROM event_filter ORDER BY filter_name ASC")
LiveData<List<EventFilter>> getAllEventsFilters();
@Query("SELECT * FROM event_filter LIMIT 1")
EventFilter[] getAnyEventFilter();
@Query("SELECT * FROM events ORDER BY event_millis ASC")
LiveData<List<Events>> getAllEvents();
@Query("SELECT * FROM events WHERE event_filter = :event_filter")
LiveData<List<Events>> getFilteredEvents(List<Events> event_filter);
@Query("SELECT * FROM events LIMIT 1")
Events[] getAnyEvent();
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insertNewEvents(Events events);
@Insert(onConflict = OnConflictStrategy.IGNORE)
void insertNewEventFilters(EventFilter eventFilter);
@Delete
void deleteEvent(Events events);
@Query("DELETE FROM events")
void deleteAllEvents();
@Update
void update(Events... events);
}
Запрос, который вызывает у меня проблемы, - это запрос:
@Query ("ВЫБРАТЬ * ИЗ событий ГДЕ event_filter =: event_filter") LiveData> getFilteredEvents (Список event_filter);
У меня есть числовой фильтр, назначенный в столбце, чтобы я мог отсортировать данные. Я пытаюсь получить это целое число, чтобы отображать нужные элементы в recyclerview. Я не уверен, что добавить в VeiwModeler, чтобы ограничить его. Пока что мой ViewModeler выглядит следующим образом:
public class ValleyViewModel extends AndroidViewModel {
private DataRepository mRepository;
private LiveData<List<Events>> mAllEvents;
private LiveData<List<EventFilter>> mAllEventsFilter;
public ValleyViewModel(@NonNull Application application) {
super(application);
mRepository = new DataRepository(application);
mAllEvents = mRepository.getmAllEvents();
mAllEventsFilter = mRepository.getmAllEventFilters();
}
LiveData<List<Events>> getAllEvents() {
return mAllEvents;
}
LiveData<List<EventFilter>> getmAllEventsFilter() {return mAllEventsFilter;}
public void insert(Events events) {
mRepository.insert(events);
}
public void deleteAll() {
mRepository.deleteAll();
}
public void deleteWord(Events events) {
mRepository.deleteWord(events);
}
public void update(Events events) {
mRepository.update(events);
}
}
Как я могу использовать критерии WHERE в ROOM?




«Я не уверен, что добавить в VeiwModeler, чтобы ограничить его», если вы правильно поняли, вы хотите ограничить запрос.
Насколько я понимаю, это делается в классе Dao, например, в ValleyDao, где вы запускаете запрос SQLite:
@Query("SELECT * FROM events WHERE id = :event_id")
Event findSpecificEvent(long event_id);
В приведенном выше примере кода я пытаюсь найти конкретное событие, для которого id - это 1. Затем в Repository:
public Event findSpecificEvent(long event_id) {
return mValleyDao.findSpecificEvent(event_id);
}
В классе ViewModel:
public Event findSpecificEvent(long event_id) {
return mRepository.findSpecificEvent(event_id);
}
В вызывающем классе, где я хочу передать Event в recyclerViewadapter:
Event event = mViewModel.findSpecificEvent(1);
// An example to pass it to recyclerVeiw
recyclerViewAdapter.setEvent(event);
Помните, что при использовании приведенного выше примера вам нужно делать это в фоновом потоке.
Вот что я в итоге сделал для решения:
В Дао:
@Query("SELECT * FROM events WHERE event_filter = :event_id")
LiveData<List<Events>> findSpecificEvent(long event_id);
LiveData попадает туда, где я не работаю в основном потоке пользовательского интерфейса.
Никаких изменений не потребовалось в базе данных AppDatabase (абстрактный класс в структуре Room).
В репозитории: (работает, но я не уверен, что это лучший способ)
public LiveData<List<Events>> getmCertainEvents(long eventsId) {
return mDao.findSpecificEvent(eventsId);
}
В ViewModeler:
LiveData<List<Events>> getmCertainEvents(long eventId) {
return mRepository.getmCertainEvents(eventId);
}
и, наконец, в моем списке действий:
final EventRecyclerAdapter adapter = new EventRecyclerAdapter(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
// Set up the WordViewModel.
mViewModel = ViewModelProviders.of(this).get(ValleyViewModel.class);
mViewModel.getmCertainEvents(FILTERLEVEL).observe(this, new Observer<List<Events>>() {
@Override
public void onChanged(@Nullable final List<Events> events) {
// Update the cached copy of the words in the adapter.
adapter.setEvents(events);
}
});