2017-07-28 50 views
0

我試圖用rxJava支持重構我的同步過程。 但我遇到了一個奇怪的(對我來說)錯誤。RxJava和Firebase數據庫

最初,我執行'同步'程序。然後在'onCompleted'中執行syncPart2。這是相同的過程(但與其他節點同步)

在'syncPart2'我得到'錯誤= DatabaseError:權限被拒絕'。數據庫規則一切正常,這個錯誤出現在不同的節點上(並且當前同步工作正常)。

基本上,我有16個節點要逐一同步,完全按照特定的順序。也許我選擇了錯誤的Rx操作來做到這一點?順便說一下,如果我只使用一個'concat',一切都OK!但是我有超過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); 

        } 
       }); 
    } 
+0

libs版本:com.google.firebase:firebase-database:11.0.2和io.reactivex:rxjava:1.1.0 – crd

+0

確保應用名稱和客戶端ID與Firebase控制檯中的相同。 – sasikumar

+0

如果我使用沒有rx的同步,我沒有麻煩 – crd

回答

0

實際上,權限不是這個問題的原因。

我有'InvocationTargetException',因爲Realm不正確的線程。但爲什麼錯誤是'權限被拒絕'對我來說仍然是一個難題。