使用存储库在本地 Database/Location 和网络之间同步
Sync between Local Database/Location and Network using Repository
我正在实现一个天气应用程序,它通过 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;
}
}
}
可以找到我单独的 class 获取位置 here。对于预测,它只是 Retrofit。
我将如何在存储库中组合这些元素?
我遇到了同样的问题。基本上你想在 Repository
中编写逻辑来决定是从服务器还是本地数据库获取数据。
幸运的是,这是一个非常普遍的问题,因此 Google 提出了 NetworkBoundResource class.
NetworkBoundResource
是一个普通的 class,它使用 MediatorLiveData
的力量在本地数据库和您的 web-service 之间完成数据流的工作。
我正在实现一个天气应用程序,它通过 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;
}
}
}
可以找到我单独的 class 获取位置 here。对于预测,它只是 Retrofit。
我将如何在存储库中组合这些元素?
我遇到了同样的问题。基本上你想在 Repository
中编写逻辑来决定是从服务器还是本地数据库获取数据。
幸运的是,这是一个非常普遍的问题,因此 Google 提出了 NetworkBoundResource class.
NetworkBoundResource
是一个普通的 class,它使用 MediatorLiveData
的力量在本地数据库和您的 web-service 之间完成数据流的工作。