Получить список данных базы данных Firebase с помощью rxjava - PullRequest
0 голосов
/ 03 марта 2020

Я создаю приложение android с использованием Firebase. Моя база данных Firebase имеет следующую структуру:

Users:{
       uid:{
           name:Bruno,
           age: 22,
           email: bruno@gmail.com,
           address:...
           }
       },

Level_info:{
          uid:{
              score:70,
              level:5
              }
           }

До Rx java, я получаю всех пользователей вот так:

   userRef.addValueEventListener(new ValueEventListerner(){
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for(Datasnapshot snapshot:dataSnapshot.getChildren())
    {
     User user = snapshot.getValue(User.class);
     userList.add(user);

     //to get score and levels
     /*I can't add nested value event listener directly because of Asynchronous behavior */
     userId.add(user.getId());
    }
    getLevels(userId);
 }

@Override
public void onCancelled(DatabaseError error) {
   //handle errors
 }
});

void getLevels(final ArrayList<String> userid){

        levelRef.addValueEventListener(new ValueEventListener(){
   @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
    for(String id:userid)
     {
       Level level = dataSnapshot.child(id).getValue(Level.class);
      levelList.add(level);
       }
  /** Attch both "userList" and "levelList" to RecyclerView */
        }
  @Override
  public void onCancelled(DatabaseError error) {
   //handle errors
     }
  });
 }

Все идет хорошо. Но если есть много вложенных Слушателей , Это будет трудно читать. Так что я попытался изменить на Rx Java и Rx Android. Как это -

public Observable<ArrayList<User>> userOb(){
return Observable.create(new 
   ObservableOnSubscribe<ArrayList<User>>() {

  @Override
  public void subscribe(final 
ObservableEmitter<ArrayList<User>> emitter) 
throws Exception {
FirebaseDatabase.getInstance().getReference("Users")
                    .addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
  ArrayList<UserModel> listUsers;
    for(DataSnapshot snapshot: dataSnapshot.getChildren()){
  User user = snapshot.getValue(User.class);
  listUsers= new ArrayList<>();
  listUsers.add(user);
  emitter.onNext(listUsers);
   }
   emitter.onComplete();
   }

  @Override
  public void onCancelled(@NonNull DatabaseError databaseError) {
    }
   });
   }

 });
}

Здесь я не знаю, как архивировать с помощью LevelObservable, потому что levelObservable нужен UserId из UserObservable для получения данных из Levels/(uid)/"level_info". Может быть, это глупый вопрос, но я новичок в Rx Java. Я хочу получить соответствующий userId из UserObservable в LevelObservable. Так как я могу это сделать? Извините за мой плохой навык письма Engli sh.

Редактировать: Есть ли способы реализовать подобное (потому что, может быть, я упускаю некоторые простые способы реализации).

...