使用Android Room以mvvm模式从数据库中提取数据时在哪里放置逻辑?

时间:2019-07-04 10:35:51

标签: android mvvm architecture repository android-room

我正在使用room,repository,viewmodel和ets将旧应用程序重构为mvvm模式。

我有一个旧代码,其中包含具有许多功能的Content provider helper类:

    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
    ...
    }

我的问题是放置此逻辑的哪一层?它应该包含一个存储库或视图模型吗?我在网上看到的所有示例都很简单,不符合我的目标。

1 个答案:

答案 0 :(得分:0)

视图模型可帮助我们在存储库和UI之间提供数据。为了与会议室数据库直接交互,我们使用存储库。一旦从仓库中获取数据,我们就可以在ViewModel中执行各种计算(即排序,过滤等)。

为了显示数据库中的数据,我们使用了一个观察者,它将观察数据的变化,即ViewModel中的LiveData。

我们使用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);
}
}

现在在视图模型中

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