在Android MVVM体系结构的存储库中执行数据库读取操作

时间:2019-02-14 14:55:59

标签: android mvvm repository viewmodel

在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中观察List并将所有信息传递到存储库中,还是 (b)让存储库处理address_table中的数据吗?

0 个答案:

没有答案