如何修改数据库中的实时数据并将其转发到视图



我正在从我的视图模型中的数据库中获取LiveData>。但是我必须将一些 Foo 对象添加到列表中,然后才能将它们转发到视图中。

我正在使用房间 API 来访问数据库。我正在使用推荐的 Dao、存储库和视图模型封装。存储库只是从 Dao 转发 LiveData。在视图模型中,我从存储库调用该方法并将结果存储在变量中。因为我不能使用 LiveData-对象的观察方法,所以我尝试了 Transformations.map-method。但是映射方法在任何时候都不会被调用。

public class FooViewModel extends AndroidViewModel {
   private LiveData<List<Foo>> fromDatabase;
   private MutableLiveData<List<Foo>> forView;
   public FooViewModel(/*...*/) {
      //...
      forView = new MutableLiveData<>();
   }
   //Returns the LiveData<List> for the view, that should be observed
   public LiveData<List<Foo>> getViewList() {
      return forView;
   }
   //Loads the data from the database, modifies it and maps it to the LiveData for the view
   public void loadFromDatabase(/*Some conditions for query*/) {
      fromDatabase = repository.getData(/*Some conditions*/);
      Transformations.map(fromDatabase, (foos) -> {
         forView.setValue(fillList(foos));
         return forView;
      }
   }
   //Fills the list with some other foos
   private static List<Foo> fillList(List<Foo> foos) {
      //Fill the list
   }
}

在视图中,我以这样的方式观察列表:

public class FooActivity {
   protected void onCreate(/*Some inputs*/) {
      viewModel.getViewList().observe(this, (foos) -> /*Display the list*/);
      viewModel.loadFromDatabase(/*with some conditions*/);
   }
}

然后什么也没发生...我还尝试转发从存储库获取的 LiveData 并观察它。这种观察效果很好。但不是修改后的那个。

   //Loads the data from the database, modifies it and maps it to the LiveData for the view
   public void loadFromDatabase(/*Some conditions for query*/) {
      fromDatabase = repository.getData(/*Some conditions*/);
      Transformations.map(fromDatabase, (foos) -> {
         forView.setValue(fillList(foos));
         return forView;
      }
   }

这永远不会奏效。 fromDatabase被替换,但转换是针对前一个fromDatabase实例完成的。

您需要将查询条件设置为MutableLiveDataTransformations.switchMap该返回通过 DAO 应用的正确过滤器的LiveData<List<T>>

然后,如果您修改条件实时数据,DAO 将使用新条件重新评估新列表。

最新更新