Android Room выбор строки с запросом

Я новичок в использовании функциональности комнаты, и я установил свой 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?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
2 139
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

«Я не уверен, что добавить в 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);

                    }
                });

Другие вопросы по теме