首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >房间与回溯与Dagger2的结合

房间与回溯与Dagger2的结合
EN

Stack Overflow用户
提问于 2018-07-02 14:07:43
回答 2查看 861关注 0票数 0

怎样才能创造出有房有重的刀呢?

我有这样的数据库模块:

代码语言:javascript
复制
@Module
public class ApplicationDatabaseModule {

private final String mDatabaseName;
ApplicationDatabase mApplicationDatabase;

public ApplicationDatabaseModule(@ApplicationContext Context context, Class<? extends ApplicationDatabase> roomDataBaseClass, String databaseName) {
    mDatabaseName = databaseName;
    mApplicationDatabase = Room.databaseBuilder(context, roomDataBaseClass, mDatabaseName).build();
}

@Singleton
@Provides
ApplicationDatabase provideApplicationDatabase() {
    return mApplicationDatabase;
}

@Singleton
@Provides
CitiesDao provideCitiesDao() {
    return mApplicationDatabase.getCitiesDao();
}

}

这样的POJO类:

代码语言:javascript
复制
@Entity
public class City {

@PrimaryKey
@ColumnInfo(name = "id")
private int cityId;

@ColumnInfo(name = "name")
private String cityName;

public int getCityId() {
    return cityId;
}

public void setCityId(int cityId) {
    this.cityId = cityId;
}

public String getCityName() {
    return cityName;
}

public void setCityName(String cityName) {
    this.cityName = cityName;
}

@Override
public String toString() {
    return "City [cityId = " + cityId + ", cityName = " + cityName + "]";
}
}

DAO接口如下:

代码语言:javascript
复制
@Dao
public interface CitiesDao {

@Insert
void insertCities(City... cities);

@Query("SELECT * FROM City")
City[] queryCities();

}

以及用于改装的API:

代码语言:javascript
复制
public interface CitiesApi {
@GET("/api/cities")
Call<City[]> requestCities();
}

如我所知,DAO负责访问数据,包括通过REST客户机传递的数据.但这两个部分由接口表示,并被构建成单独的类。实现DAO的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-03 14:28:31

DAO负责访问数据。

,包括通过REST客户端传递的数据。

上帝不

实现DAO的正确方法是什么?

房间已经根据您的接口+注释为您的DAO生成了一种正确的实现方式,我认为它被称为CitiesDao_Impl

怎样才能创造出有房有重的刀呢?

房间不知道重新装修,也不应该知道重新装修。它只关心本地数据持久性。

这意味着您的DAO需要如下所示:

代码语言:javascript
复制
@Dao
public interface CitiesDao {

    @Insert
    @Transaction
    void insertCities(City... cities);

    @Query("SELECT * FROM City")
    LiveData<List<City>> queryCities();

}

因此,您实际上需要的是,当缓存无效(强制获取新数据)或同步任务应该运行时(例如,设备充电时,您在WIFI上,凌晨2点到7点)时,需要一个工作人员在后台获取新数据--为此您需要WorkManager)。

立即获取新数据相当容易,您所需要的要么是在从AsyncTask返回null的单例上下文中的一个doInBackground,要么是您自己的执行器将您的后台任务提交给它。

代码语言:javascript
复制
 public class FetchCityTask extends AsyncTask<Void, Void, Void> {
     ...

     @Override
     protected Void doInBackground(Void... params) {
         List<City> cities = citiesApi.requestCities().execute().body(); // TODO error handling
         citiesDao.insertCities(cities);
         return null;
     }
 }

然后

代码语言:javascript
复制
new FetchCityTask(...).execute();

现在,当此任务运行时,您的UI将通过观察存储在LiveData中的ViewModel来使用最新数据进行更新。

代码语言:javascript
复制
public class CitiesViewModel
        extends ViewModel {
    private final CitiesDao citiesDao;

    private LiveData<List<City>> liveResults;

    public CitiesViewModel(...) {
        ...
        liveResults = citiesDao.queryCities();
    }

    public LiveData<List<City>> getCities() {
        return liveResults;
    }
}

代码语言:javascript
复制
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    recyclerView = view.findViewById(R.id.recycler_view);
    CitiesViewModel viewModel = ViewModelProviders.of(this).get(CitiesViewModel.class, ...);

    ...
    viewModel.getTasks().observe(getViewLifecycle(), list -> {
        //noinspection Convert2MethodRef
        listAdapter.submitList(list);
    });
}
票数 1
EN

Stack Overflow用户

发布于 2018-07-02 18:08:53

您希望创建一个存储库类来处理数据。然后,您只需与存储库交互即可。你的一些伪码:

代码语言:javascript
复制
class Repository {
   private CitiesDao localSource;
   private CitiesApi remoteSource;

   public Repository() {
       //initialize objects here
   }

   City[] getCities() {
       if (networkIsAvailable) {
           City[] cities = remoteSource.requestCities();
           saveCitiesToDatabase(cities);
           return cities;
       } else {
           return localSource.queryCities();
       }
   }

   private void saveCitiesToDatabase(City[] cities) {
    //TODO save cities to databse
   }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51138100

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档