使用ViewModel模式RoomDatabase一次从DAO获取数据

时间:2019-04-09 14:02:51

标签: android android-room

我有一个使用库 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的函数还是有一种更简洁的方法?

1 个答案:

答案 0 :(得分:2)

在第二种情况下,您无需观察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);
        }
    }
 });