RxJava和Firebase数据库

时间:2017-07-28 11:25:19

标签: android firebase firebase-realtime-database rx-java

我尝试使用rxJava支持重构我的同步过程。 但是我遇到了一个奇怪的(对我来说)错误。

最初,我执行' sync'程序。然后在' onCompleted'我执行syncPart2。它是相同的过程(但与其他节点同步)

在' syncPart2'我得到错误= DatabaseError:Permission denied'。使用数据库规则一切正常,此错误出现在不同的节点上(并且当前同步工作正常)。

基本上,我有16个节点一个接一个地同步,完全按照特定的顺序。也许我选择了错误的Rx操作来做到这一点?顺便说一句,如果我只使用一个' concat'一切还好!但我有超过9个(最大尺寸的' concat' args)节点要同步。

public class RxFirebaseDatabase {

    @NonNull
    public static Observable<DataSnapshot> observeSingleValueEvent(@NonNull final Query query) {
        return Observable.create(new Observable.OnSubscribe<DataSnapshot>() {
            @Override
            public void call(final Subscriber<? super DataSnapshot> subscriber) {
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (!subscriber.isUnsubscribed()) {
                            subscriber.onNext(dataSnapshot);
                            subscriber.onCompleted();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError error) {
                        if (!subscriber.isUnsubscribed()) {
                            subscriber.onError(new RxFirebaseDataException(error));
                        }
                    }
                });
            }
        });
    }

}




public static void sync() {

        Observable.concat(

                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.DELETED_OBJECTS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.MSI_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.COURSES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.ALLERGIES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.PHONES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.MEDICINES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.PROFILES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.ANALYSES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.DIAGNOSES_NODE))

        )
                .observeOn(Schedulers.io())
                .subscribe(new Subscriber<DataSnapshot>() {
                    @Override
                    public void onCompleted() {

                        syncPart2();

                    }

                    @Override
                    public void onError(Throwable e) {

                        Log.d(AppConstants.TAG_SYNC, "The error appears: " + e.getMessage());

                    }

                    @Override
                    public void onNext(DataSnapshot dataSnapshot) {

                        GenericClass genericClass = retrieveInfoAboutNode(dataSnapshot);

                        if (genericClass.getMyType() == DeletedObject.class) {

                            handleDeletedObjects(dataSnapshot);

                        } else if (genericClass.getMyType() == MedicineSchedulerItem.class) {

                            handleMSI(dataSnapshot);

                        } else if (genericClass.getMyType() == MedicineCourse.class) {

                            handleMedicineCourse(dataSnapshot);

                        } else {

                            handle(dataSnapshot, genericClass);

                        }

                    }
                });
    }

    public static void syncPart2() {

        Observable.concat(
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.HOSPITALS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.RECOMMENDATIONS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.USER_FILES_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.SPECIALIZATIONS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.DOCTORS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.DOCTOR_VISITS_NODE)),
                RxFirebaseDatabase.observeSingleValueEvent(getFirebaseReference(AppConstants.FIREBASE_CONSTANTS.PHOTOS_NODE))
        )
                .subscribe(new Subscriber<DataSnapshot>() {
                    @Override
                    public void onCompleted() {

                        EventBus.getDefault().post(new FirebaseEvents().new SyncFinished().new AllTasksFinished());

                    }

                    @Override
                    public void onError(Throwable e) {

                        Log.d(AppConstants.TAG_SYNC, "The error appears: " + e.getMessage());

                    }

                    @Override
                    public void onNext(DataSnapshot dataSnapshot) {

                        GenericClass genericClass = retrieveInfoAboutNode(dataSnapshot);

                        handle(dataSnapshot, genericClass);

                    }
                });
    }

1 个答案:

答案 0 :(得分:0)

实际上,权限不是导致此问题的原因。

由于Realm错误的线程,我遇到了'InvocationTargetException'。但为什么错误是'权限被拒绝'仍然是我的难题。