2017-07-28 12 views
0

私はrxJavaサポートで同期手順をリファクタリングしようとしています。 しかし、私は奇妙な(私のために)エラーに直面しました。RxJavaとFirebaseデータベース

最初に、私は '同期'手順を実行します。次に、 'onCompleted'で私はsyncPart2を実行します。それは私が得る「syncPart2」は、

(が、他のノードと同期するように)同じ手順だ「というエラー= DatabaseErrorは:アクセス許可が拒否されました」。データベースのルールはすべて正常ですが、このエラーはさまざまなノードに表示されます(現在の同期は正常に動作します)。

基本的には、正確に特定の順序で1つずつ、16個のノードを同期させます。多分私は間違ったRx操作を選択したでしょうか?ちなみに、私が1つだけ 'concat'すべてを使用する場合、大丈夫!しかし、私は同期するためのノード(concat 'argsの最大サイズ)が9以上あります。

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 consoleと同じであることを確認してください。 – sasikumar

+0

rxなしで同期を使用しても問題はありません – crd

答えて

0

実際には、アクセス許可がこの問題の原因ではありませんでした。

Realmの不正なスレッドのために 'InvocationTargetException'が発生しました。しかし、なぜそのエラーは「権限が拒否されました」が私にとってはまだパズルです。

関連する問題