Android 房间选择一行查询
Android Room selecting a row with query
我刚开始使用 Room 功能,我已经使用以下设置我的 Dao
public 接口 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);
}
给我问题的查询是查询:
@查询("SELECT * FROM events WHERE 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);
}
}
如何在 ROOM 中使用 WHERE 标准?
"I am not sure what to put in the VeiwModeler to limit it",如果理解正确,你要限制查询。
根据我的理解,这是在 Dao
class 中完成的,例如,在 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
class:
public Event findSpecificEvent(long event_id) {
return mRepository.findSpecificEvent(event_id);
}
在调用 class 时我想将 Event
传递给 recyclerView
的 adapter
:
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 在主 UI 线程上到达我不在的地方 运行。
不需要对 AppDatabase 进行更改(Room 结构中的抽象 class)。
在存储库中:(有效但我不确定这是否是最佳方式)
public LiveData<List<Events>> getmCertainEvents(long eventsId) {
return mDao.findSpecificEvent(eventsId);
}
在 ViewModeler 中:
LiveData<List<Events>> getmCertainEvents(long eventId) {
return mRepository.getmCertainEvents(eventId);
}
终于在我的列表中 Activity:
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);
}
});
我刚开始使用 Room 功能,我已经使用以下设置我的 Dao
public 接口 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);
}
给我问题的查询是查询:
@查询("SELECT * FROM events WHERE 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);
}
}
如何在 ROOM 中使用 WHERE 标准?
"I am not sure what to put in the VeiwModeler to limit it",如果理解正确,你要限制查询。
根据我的理解,这是在 Dao
class 中完成的,例如,在 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
class:
public Event findSpecificEvent(long event_id) {
return mRepository.findSpecificEvent(event_id);
}
在调用 class 时我想将 Event
传递给 recyclerView
的 adapter
:
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 在主 UI 线程上到达我不在的地方 运行。
不需要对 AppDatabase 进行更改(Room 结构中的抽象 class)。
在存储库中:(有效但我不确定这是否是最佳方式)
public LiveData<List<Events>> getmCertainEvents(long eventsId) {
return mDao.findSpecificEvent(eventsId);
}
在 ViewModeler 中:
LiveData<List<Events>> getmCertainEvents(long eventId) {
return mRepository.getmCertainEvents(eventId);
}
终于在我的列表中 Activity:
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);
}
});