Выполнение операций чтения из базы данных в хранилище для архитектуры Android MVVM - PullRequest
0 голосов
/ 14 февраля 2019

Каков наилучший способ доступа к данным из нескольких таблиц базы данных в архитектуре MVVM?

Я использую практический подход к изучению архитектуры MVVM путем создания приложения для Android.Я понимаю, как различные компоненты подходят и работают вместе.Я подумываю о том, чтобы добавить сложности в это приложение, добавив несколько таблиц в базу данных appDatabase и получая к ним доступ для формирования запроса, который можно использовать для вызова веб-службы из слоя Repository.

Мой вопрос: какова вашамнение о лучшей практике?(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;
   }
   ...
}

С соответствующими ViewModels:

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

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

My MainActivity.java наблюдает за LiveIata allItems:

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, чтобы инициировать запрос веб-службы, используя этот адрес назначения.

Каким будет хороший архитектурный дизайн?(а) Должен ли я наблюдать Список в MainActivity и передавать всю информацию в хранилище, или (б) позволить хранилищу манипулировать данными из address_table?

...