我正在开发一个 Android 应用程序,用户可以根据特定日期保存餐食及其金额。
时间存储为 yyyy-mm-dd
目前 SQLite 数据库中的字符串(我稍后可能会更改数据类型)。
用户可以在CalendarView
上选择日期。和 RecylerView
应该只显示所选日期的餐食。我不想检索所有行,而只是根据日期查询行。
我正在使用Room Persistence Library .
我怎样才能实现这个目标?
我正在使用LiveData<List<MYOBJECT>>
和适当的可观察监听器:
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
中的不同值使用react。因此我无法从数据库中查询不同的行。
这是否可能,或者我是否必须坚持查询整个表,然后从我的List<MYOBJECT
中选择数据?
最佳答案
而不是制作列表observable
将 myDate 变量设为 observable
。因为改变的是日期而不是列表。
您可以通过以下方式实现此目的:
让你的myDate
作为MutabeLiveData
在 View 模型中。然后,当从CalenderView
中选择日期时,您可以更改其值。使用setValue(newDate)
.
现在,观察这个 myDate
,并在值更改时,获取具有更新日期值的列表并更新 RecyclerView
.
还可以使用时间戳,而不是将日期存储为 yyyy-mm-dd
字符串。
************更新****************
进一步说明的示例
在 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.不要在主线程上运行数据库查询,并调用 notifyDataSetChanged
在setItems()
适配器刷新 Recyclerview。
关于java - 如何根据 Android Room 的参数查询实时数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53952078/