Где разместить логику при извлечении данных из базы данных в шаблоне mvvm, используя комнату Android? - PullRequest
0 голосов
/ 04 июля 2019

Я выполняю рефакторинг старого приложения в шаблон mvvm, используя комнату, репозиторий, viewmodel, ets.

У меня есть старый код, который содержит вспомогательный класс провайдера контента со многими функциями, подобными этим:

    public static int deleteOldLogs(int NumDays) {
    //get NumDays before today, then constract a content provider delete command and run
    ...
    }
or 
public static Cursor getTodayLogs() {
    //get a day from today, then constract a content provider query and run
        ...
    }
or
    public static boolean isActionValid(Context context, int id_order, int id_actionh) {
    //get all products from database table, then check if all products match some criteria, then return boolean result
    ...
    }

Мой вопрос заключается в том, на каком уровне разместить эту логику?Это репозиторий или viewmodel должен содержать?Все примеры, которые я вижу в сети, очень просты и не соответствуют моим целям.

1 Ответ

0 голосов
/ 04 июля 2019

Модель представления помогает нам предоставлять данные между хранилищем и пользовательским интерфейсом.Для прямого взаимодействия с базой данных комнат мы используем репозиторий.Как только мы получим данные из репо, мы можем выполнять все виды вычислений (т.е. сортировку, фильтрацию и т. Д.) В ViewModel.

Для отображения данных из базы данных мы используем наблюдателя, который будет наблюдать за изменениями данных, LiveData во ViewModel.

Мы используем ViewModelProvider, который собирается создать ViewModel для нас.Нам нужно соединить нашу ViewModel с ViewModelProvider, а затем в методе onChanged мы всегда получаем наши обновленные данные, которые мы можем отобразить на экране.

Например,Мы хотим получить некоторую запись из нашей базы данных.

Для этого нам нужно создать репозиторий, который будет взаимодействовать напрямую с базой данных или содержать логику для извлечения данных из базы данных.

public class ABCRepository {

@Inject
DrugsDao mABCDao;

@Inject
public ABCRepository(){

}

public LiveData<List<NameModel>> getNameByLetter(String letter) {
    return mABCDao.getName(letter);
}
}

Сейчас в View Model

public class SearchViewModel extends ViewModel {

@Inject
ABCRepository mABCRepository;

LiveData<List<GlobalSearchModel>> getNameList(String queryText) {
    MutableLiveData<List<GlobalSearchModel>> mGlobalSearchResults = new 
  MutableLiveData<>();

    List<NameModel> synonymsNameList=mABCRepository.getNameByLetter(queryText);

   new Thread(() -> {
        List<GlobalSearchModel> globalSearchModelList =         
        mABCRepository.getNameByLetter(queryText)

       // this is where you can perform any action on list . either sorting or. 
       filtering and then return the new list to your UI.



        mGlobalSearchResults.postValue(globalSearchModelList);

        }).start();


    return globalSearchModelList;
}

}

В своем фрагменте или деятельности вы можете наблюдать эти данные,

            getViewModel().getAllCountries().observe(this, this::addSearchResultsInRecycler);

Надеюсь, это полезно.Хотя и не объяснил, хорошо, но вы можете иметь ссылку из

https://medium.com/@skydoves/android-mvvm-architecture-components-using-the-movie-database-api-8fbab128d7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...