首页 > 解决方案 > 在 Android MVVM 架构的存储库中执行数据库读取操作

问题描述

在 MVVM 架构中从多个数据库表访问数据的最佳实践是什么?

我正在通过创建一个 Android 应用程序来学习 MVVM 架构。我了解不同的组件如何配合和协同工作。我正在考虑通过将多个表添加到 appDatabase 并访问它们以形成可用于从存储库层调用 Web 服务的请求来增加该应用程序的复杂性。

我的问题:您对最佳实践有何看法?(a) 我是否应该在活动中将所有相关的数据库表作为 LiveData 观察并在那里构建我的请求,然后通过 ViewModel 将其发送到存储库?或者 (b) 我是否应该对活动隐藏所有这些并让存储库处理来自各个表的所有数据操作?

我有 2 个表: item_table 和 address_table

@Entity(tableName = "item_table")
public class Item {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String itemName;
    private String itemType;
    private String itemGroup;
    ...
}

@Entity(tableName = "address_table")
public class Address {

    @PrimaryKey(autoGenerate = true)
    private int id;

    private String itemGroup;
    private String destinationAddress;
    ...
}

我有相应的 DAO

@Dao
public interface ItemDao{
   @Query("SELECT * FROM item_table")
   LiveData<List<Item>> getAllItems();
}

@Dao
public interface AddressDao{
   @Query("SELECT * FROM address_table")
   LiveData<List<Address>> getAllAddresses();
}

以及相应的存储库:

public class ItemRepository{
   private ItemDao;
   private LiveData<List<Item>> allItems;
   public LiveData<List<Item>> getAllItems(){
      return allItems;
   }
   ...
}

public class AddressRepository{
   private AddressDao;
   private LiveData<List<Address>> allAddresses;
   public LiveData<List<Address>> getAllAddresses(){
      return allAddresses;
   }
   ...
}

使用相应的 ViewModel:

public class ItemViewModel extends AndroidViewModel {
   private LiveData<List<Item>> allItems;
   ...
}

public class AddressViewModel extends AndroidViewModel {
   private LiveData<List<Address>> allAddresses;
   ...
}

我的 MainActivity.java 观察到 allItems LiveData:

private ItemViewModel itemViewModel;
itemViewModel = ViewModelProviders.of(this).get(ItemViewModel.class);
itemViewModel.getAllQuickAccessDevices().observe(this, new 
Observer<List<Item>>() {
   @Override
   public void onChanged(@Nullable List<Device> devices) {
      //do stuff
      ...
   }
}

基于相应项目的 itemGroup,我想从 address_table 中获取相应的destinationAddress 以使用该destinationAddress 发起Web 服务请求。

什么是好的建筑设计?(a) 我应该观察 MainActivity 中的列表并将所有信息传递到存储库,还是 (b) 让存储库处理 address_table 中的数据?

标签: androidmvvmrepositoryviewmodel

解决方案


推荐阅读