Android Room选择带有查询的行

时间:2018-10-04 17:20:58

标签: java database android-room

我刚开始使用“房间”功能,并使用以下设置了我的Dao

公共界面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(“ SELECT * FROM events WHERE event_filter =:event_filter”) LiveData> getFilteredEvents(List 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);
}

}

如何在ROOM中使用WHERE条件?

2 个答案:

答案 0 :(得分:0)

“我不确定要在VeiwModeler中添加什么来限制它”,如果正确理解,则希望限制查询。

根据我的理解,这是在Dao类中完成的,例如,在ValleyDao内,您将在其中运行SQLite查询:

@Query("SELECT * FROM events WHERE id = :event_id")
Event findSpecificEvent(long event_id);

在上面的代码示例中,我试图找到一个id1的特定事件。然后在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传递给recyclerView的{​​{1}}的调用类中:

adapter

请记住,在使用上面的示例时,您需要在后台线程上执行此操作。

答案 1 :(得分:0)

这是我最终为解决方案所做的事情:

在道:

@Query("SELECT * FROM events WHERE event_filter = :event_id")
LiveData<List<Events>> findSpecificEvent(long event_id);

LiveData使其到达我不在主UI线程上运行的位置。

不需要更改int 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);

                    }
                });