【问题标题】:Get data from DAO once time with ViewModel pattern RoomDatabase使用 ViewModel 模式 RoomDatabase 从 DAO 获取一次数据
【发布时间】:2019-04-09 14:02:50
【问题描述】:

我有一个使用库Room Persistence Library的应用。

现在我有这个问题:

我的 ViewModel 中有:

public LiveData<List<Code>> getAllCodes() {
   return codeRepository.getAllCodes();
}

在我的codeRepository中:

public LiveData<List<Code>> getAllCodes() {
   return appDatabase.codeDao().getAll();
}

在我的 DAO

@Query("SELECT * FROM codes ORDER BY id DESC")
LiveData<List<Code>> getAll();

所以在我的活动中我可以这样做:

codeViewModel.getAllCodes().observe(this, new Observer<List<Code>>() {
   @Override
   public void onChanged(@Nullable final List<Code> codes) {
      adapter.addItems(codes);
   }
});

它可以工作,但现在,在另一个活动中,我调用了一个函数,我需要调用 RoomDatabase 获取所有代码并创建一个 CSV。 我的问题是我这样做:

 download_csv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
       codeViewModel.getAllCodes().observe(this, new Observer<List<Code>>() {
          @Override
          public void onChanged(@Nullable final List<Code> codes) {
             download(codes);
          }
       });
     }
 });

但是每次将代码模型添加到我的数据库中它都会调用下载。 那么如何从我的数据库中获取一次时间数据呢? 我应该创建第二个仅返回 List 的函数还是有更简洁的方法?

【问题讨论】:

  • 你为什么不尝试在onclick之外获取代码?定义一个变量来保存代码,并且由于您设置了观察者,因此每当您调用代码变量时,它将始终具有列表的最新版本
  • 说实话,我没明白你的问题是什么,你能试着用不同的方式解释吗?你想导出你的数据吗?
  • @joao86 是的,可以的,我试试!
  • @BrunoDiegoMartins 是的,我想导出我的数据

标签: android android-room


【解决方案1】:

在第二种情况下您不需要观察LiveData,因为这会导致每次更新代码时都会调用方法download()

如果您只想在用户单击按钮时调用download(),请执行以下操作:

download_csv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        List<Code> codes = codeViewModel.getAllCodes().getValue();
        if (codes != null) {
            download(codes);
        }
    }
 });

【讨论】:

    猜你喜欢
    • 2023-02-21
    • 1970-01-01
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2014-12-26
    • 1970-01-01
    相关资源
    最近更新 更多