java - 如何根据 Android Room 的参数查询实时数据?

标签 java android android-recyclerview android-room

我正在开发一个 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中选择数据?

最佳答案

而不是制作列表observablemyDate 变量设为 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.不要在主线程上运行数据库查询,并调用 notifyDataSetChangedsetItems()适配器刷新 Recyclerview。

关于java - 如何根据 Android Room 的参数查询实时数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53952078/

相关文章:

java - 可以通过我的服务中的套接字发送但无法接收数据

java - 指定类文件目的地

Android 在单击操作栏后退按钮时维护 ListView 上的数据

java - 如何将 int 转换为在 textView 内设置

android - 使用 ItemTouchHelper 滑动到 recyclerView 中的另一个 View

android - 如何在非 Activity 文件中调用 SupportMapFragment,即 RecyclerView Adapter

java - 如何从 JdateChooser 中添加 2 天的天数?

java - c3p0属性应该在哪里指定?

android - 不解析/导入任何类 Android Studio

android - 如何从谷歌地图 v2 中删除标记?