Возникла проблема с получением правильной информации из Firebase с несколькими поисками - PullRequest
1 голос
/ 30 марта 2019

Ниже приведен код, который я реализовал, который работает, но он присваивает последним дочерним элементам Firebase 'PoolName' и 'PoolId' все три (3) результата, когда они должны отличаться!?

playerInPoolReference = mFirebaseDatabase.getReference("PlayerInPool").child(userID);

playerInPoolReference.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if(dataSnapshot.exists()) {

                for (DataSnapshot poolSnapshot : dataSnapshot.getChildren()) {

                    String poolID = poolSnapshot.getKey();

                    poolReference = mFirebaseDatabase.getReference("Pools").child(poolID);

                    poolReference.addListenerForSingleValueEvent(new ValueEventListener() {

                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapShot) {

                            if (snapShot.exists()) {

                                pID = snapShot.getKey();

                                String gameID = snapShot.child("GameId").getValue().toString();
                                //
                                pName = snapShot.child("PoolName").getValue().toString();

                                gameReference = mFirebaseDatabase.getReference("Games").child(gameID);

                                gameReference.addListenerForSingleValueEvent(new ValueEventListener() {

                                    @Override
                                    public void onDataChange(@NonNull DataSnapshot snap) {

                                        if (snap.exists()) {

                                            Pools pool = snap.getValue(Pools.class);

                                            pool.setPoolId(pID);
                                            pool.setPoolName(pName);
                                            //
                                            poolList.add(pool);

                                            adapter = new PoolAdapter(getActivity(), poolList);

                                            recyclerView.setAdapter(adapter);

                                        } 

                                    }

                                    @Override
                                    public void onCancelled(@NonNull DatabaseError error) {

                                    }

                                });

                            } 

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }

                    });

                } // End for loop

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }

    });

Кто-нибудь знает или они реализовали решение, в котором я хотел бы получить список групп (например, пулов в моем случае), в которых находится конкретный пользователь?

В моем случае я проверяю пулы, в которых находится игрок, затем должен получить доступ к узлу пула, чтобы получить информацию о пуле, которая включает в себя конкретный идентификатор игры, а затем, наконец, получить связанную информацию об игре, чтобы я мог отобразить игроку.

Структура Firebase выглядит следующим образом:

Users
    userId1
       userName : peter
    userId2
       userName : john

Pools
    poolId1
       poolName: pool1
       etc....

    poolId2
       poolName: pool2

 Games
    1000
       gameName: game1
    1001
       gameName: game2


 PlayerInPool
    UserId
       12345: true
       54321: true
       etc...

    UserId:
       12345: true

ПРОБЛЕМА заключается в том, что он устанавливает следующее:

pool.setPoolId(pID);
pool.setPoolName(pName);

до последних значений в списке пулов!?

1 Ответ

0 голосов
/ 30 марта 2019
Users
 userId1
     userName : peter
 userId2
     userName : john


Pools
  poolId1
    poolName : pool1
  poolId2
    poolName : pool2

Games
  gameId1
     gameName : game1
  gameId2
      gameName: game2

UserPool
    poolId1
      userName: peter
    poolId2
      userName: john

GamePool
    gameId
      poolId: poolId1
      gameName : game1

Вы можете создать следующую базу данных, включая родительский узел Users, Pools и Games.Затем вы можете сделать два узла, один из которых называется UserPool, и каждый из них может включать всех пользователей в каждом пуле, а другой - GamePool, который может включать имя игры и информацию о пуле.

FirebaseDatabase database       = FirebaseDatabase.getInstance();
DatabaseReference userReference = database.getReference("UserPool");
DatabaseReference gameReference = database.getReference("GamePool");

userReference.orderByKey().equalTo(poolId).addValueEventListener(new ValueEventListener() {
 @Override
public void onDataChange(DataSnapshot dataSnapshot) {
  for(DataSnapshot ds: dataSnapshot.getChildren()){
    String keyPool = ds.getKey();
    String userId  = ds.child("userName").getValue().toString();

    gameReference.orderByChild("poolId").equalTo(keyPool).addValueEventListener(new ValueEventListener() {
          @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          for(DataSnapshot datas : dataSnapshot.getChildren()){
            String gameId   = datas.getKey();
            String gameName = datas.child("gameName").getValue().toString();
       }
     }
          @Override
       public void onCancelled(DatabaseError databaseError) {}
    });

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

Здесь вы помещаете ссылку на child UserPool и извлекаете poolId и userNames, вы также можете добавить другую информацию и получить ее здесь.

Затем вы используете вложенный valueEventListener, который относится кузел gamePool и, используя ключ, который вы извлекли (это poolId), вы создаете запрос и orderByChild("poolId").equalTo(keyPool) и извлекаете название игры и другую информацию, которую вы можете добавить туда, например, информацию об игре ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...