使用存储库在本地数据库/位置和网络之间同步

Sul*_*man 2 java android android-fragments android-room android-architecture-components

我正在实施一个天气应用程序,它通过 Retrofit 从 DarkSky 获取预报,并从 GoogleFusedLocationClient 获取位置。我的目标是通过应用程序关闭和配置更改来保存 UI 数据。我使用 Room+ViewModel+LiveData 和 Repository 模型实现了它。但是我在片段中而不是在存储库中获取我的位置和预测,目标是将其移动到存储库。
以便存储库查看数据库,如果它是空的,则从网络中获取数据。
我当前的存储库:

public class UIRepository {

    private UIDao mUIDao;
    private LiveData<List<UIData>> mAllUIData;

    UIRepository(Application application) {
        PhotoDatabase db = PhotoDatabase.getDatabase(application);
        mUIDao = db.uiDao();
        mAllUIData = mUIDao.getAllUIData();
    }

    LiveData<List<UIData>> getAllUIData() {
        return mAllUIData;
    }

    public void insert(UIData uiData) {
        new insertAsyncTask(mUIDao).execute(uiData);
    }

    private static class insertAsyncTask extends AsyncTask<UIData, Void, Void> {

        private UIDao mAsyncDao;

        insertAsyncTask(UIDao uiDao) {
            mAsyncDao = uiDao;
        }

        @Override
        protected Void doInBackground(UIData... uiData) {
            mAsyncDao.insert(uiData[0]);
            return null;
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

可以在此处找到我用于获取位置的单独类。对于预测,它只是 Retrofit。
我将如何在存储库中组合这些元素?

Aks*_*iya 5

我遇到了同样的问题。基本上你想在Repository其中编写逻辑来决定是从服务器还是本地数据库获取数据。幸运的是,这是非常普遍的问题,因此 Google 制作了NetworkBoundResource类。

NetworkBoundResource是一个普通的类,它使用MediatorLiveData.

阅读更多信息:https : //proandroiddev.com/building-modern-apps-using-the-android-architecture-guidelines-3238fff96f14

和官方文档:https : //developer.android.com/jetpack/docs/guide