2017-07-28 61 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不正确的线程。但为什么错误是'权限被拒绝'对我来说仍然是一个难题。