RxJava与android存储库模式

问题描述 投票:2回答:1

我使用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();
android repository-pattern rx-java2 android-room
1个回答
2
投票

您可以使用以下内容

public Observable<List<SubjectModel>> getSubjectList() {
    return Observable
            .concat(getDbSubjectList(), getApiSubjectList())
            .first();
}

如果从第一个流中获取值,则不会执行第二个流。

有一篇关于那个here的好文章

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.