我使用RxJava
存储库模式,Room
作为数据库,Retrofit
用于从api获取数据。这是我的Dao
@Dao
public interface SubjectDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(SubjectEntity... subjects);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertSubjectEntities(List<SubjectEntity> subjectEntities);
@Insert(onConflict = OnConflictStrategy.IGNORE)
long createSubjectIfNotExists(SubjectEntity subject);
@Query("SELECT * FROM "+ DbConstants.SUBJECT_LIST_NAME)
Single<List<SubjectEntity>> getAllSubjects();
}
Api电话:
public interface BcsQuestionService {
@GET("get/bTQwGnFsky?indent=2")
Observable<List<SubjectModel>> getAllSubject();
}
这是我的存储库:
public class SubjectRepo extends BaseRepo {
private static final String TAG = "SubjectRepo";
@Inject
public SubjectRepo(DataManager dataManager, SubjectService apiService) {
super(dataManager, apiService);
}
public Observable<List<SubjectModel>> getSubjectList() {
return Observable
.concatArray(getDbSubjectList(), getApiSubjectList())
.observeOn(AndroidSchedulers.mainThread());
}
public Observable<List<SubjectModel>> getDbSubjectList() {
return mDataManager.getSubjectList()
.filter(new Predicate<List<SubjectEntity>>() {
@Override
public boolean test(List<SubjectEntity> subjectEntities) throws Exception {
return !ListUtils.isEmpty(subjectEntities);
}
}).map(new Function<List<SubjectEntity>, List<SubjectModel>>() {
@Override
public List<SubjectModel> apply(List<SubjectEntity> subjectEntities) throws Exception {
List<SubjectModel> models = new ArrayList<>();
for (SubjectEntity entity: subjectEntities) {
SubjectModel model = new SubjectModel();
model.setId(entity.getId());
model.setName(entity.getName());
}
return models;
}
})
.subscribeOn(Schedulers.io())
.toObservable();
}
public Observable<List<SubjectModel>> getApiSubjectList() {
return mApiService.getAllSubject()
.doOnNext(new Consumer<List<SubjectModel>>() {
@Override
public void accept(List<SubjectModel> subjectModels) throws Exception {
List<SubjectEntity> entities = new ArrayList<>();
for (SubjectModel model: subjectModels) {
SubjectEntity entity = new SubjectEntity();
entity.setId(model.getId());
entity.setName(model.getName());
}
mDataManager.insertSubjectListEntity(entities);
}
});
}
}
目前我使用concatArray
运算符从数据库和api获取数据。但是只有当我从数据库中得不到任何东西时才想调用api。我想将数据保存到数据库中。我应该使用哪个操作员来实现我的目的?
另外, 我希望在将数据插入数据库时更新我的视图。因此我将改变这种方法
@Query("SELECT * FROM "+ DbConstants.SUBJECT_LIST_NAME)
Single<List<SubjectEntity>> getAllSubjects();
进入这个
@Query("SELECT * FROM "+ DbConstants.SUBJECT_LIST_NAME)
Flowable<List<SubjectEntity>> getAllSubjects();
答案 0 :(得分:2)
您可以使用以下
public Observable<List<SubjectModel>> getSubjectList() {
return Observable
.concat(getDbSubjectList(), getApiSubjectList())
.first();
}
如果从第一个流中获取值,则不会执行第二个流。
关于here
的文章不错