android - 在 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 中的数据?
解决方案
推荐阅读
- wordpress - wordpress 中 register_custom _post 中标签和参数的辅助参数也有什么关系?
- verilog - Sync FIFO simulation does not work as expected
- html - 如何使用 jinja2 语法从gentlest() 方法中获取单选按钮值?
- docker - 无法在具有 Linux Runner 的 Docker 容器中执行 GO 二进制文件
- python - 如何在 colab 中实现命令行参数?
- python - multiprocessing.Pool().map 工作函数错误中参数的多个值
- r - 如何过滤R中数据框每一列中的NA
- python - Python 脚本能否在其自身死亡时产生一个新进程?
- javascript - 从包含它们的 json 文件中自动化 Dialogflow 中提出的问题和答案
- sql - 如何在 Postgres 9.4 中忽略没有唯一约束的重复项?