简体   繁体   English

检索多个子分支Firebase

[英]Retrieve Multiple Child branches Firebase

Ok so I have made a CardView hold one database item(in this case a football player) and adapted it in a RecyclerView. 好的,所以我让CardView容纳了一个数据库项(在这种情况下为足球运动员),并在RecyclerView中对其进行了修改。 My Firebase Database looks like this: 我的Firebase数据库如下所示:

Players:
    |---Goalkeepers:
           |--GoalkeeperName
                     |--(And some other data fields)
    |---Defenders:
    |---Midfielders:
    |---Attackers

My database reference looks like this: 我的数据库参考如下所示:

playersDatabase = FirebaseDatabase.getInstance().getReference("Players").child("Goalkeepers");

If I leave the reference as ("Players"), it will give me 4 empty fields representing the Goalkeeper, Defenders, Midfielders and Attackers branch. 如果我将引用保留为(“玩家”),它将为我提供4个空字段,分别代表守门员,后卫,中场和进攻者分支。 How do I display all data from all Position branches such as Goalkeeper, Defenders, Midfielders and Attackers? 如何显示所有位置分支(如守门员,后卫,中场和进攻者)的所有数据?

Also is there any way of displaying all the players in an organised way with headings in my layout so it looks like this? 还有没有什么办法可以在我的布局中以标题的形式组织所有球员,所以看起来像这样?

Goalkeepers(heading)
Goalkeeper1
Goalkeeper2
Defenders (heading)
Defender1
Defender2

This is the code from the actual app: 这是来自实际应用程序的代码:

public class PlayerList extends AppCompatActivity {

private RecyclerView mPlayerList;
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");





@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_squad_list);
    //playersDatabase = FirebaseDatabase.getInstance().getReference("Players").child("Goalkeepers");
    playersRef.keepSynced(true);

    //new code
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String typeOfPlayer = ds.getKey();
                Log.d("TAG", typeOfPlayer);

                for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                    String player = dSnapshot.getKey();
                    Log.d("TAG", "    " + player);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    playersRef.addListenerForSingleValueEvent(valueEventListener);




    mPlayerList = (RecyclerView) findViewById(R.id.my_recycle_view);
    mPlayerList.setHasFixedSize(true);
    mPlayerList.setLayoutManager(new LinearLayoutManager(this));



}



@Override
protected void onStart() {
    super.onStart();
    FirebaseRecyclerAdapter<Player, PlayerViewHolder>firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Player, PlayerViewHolder>(Player.class, R.layout.player_row, PlayerViewHolder.class, playersRef) {
        @Override
        protected void populateViewHolder(PlayerViewHolder viewHolder, Player model, int position) {

            viewHolder.setPlayerName(model.getPlayerName());
            viewHolder.setPlayerSurname(model.getPlayerSurname());
            viewHolder.setPlayerPosition(model.getPlayerPosition());

        }
    };


    mPlayerList.setAdapter(firebaseRecyclerAdapter);
}


public static class PlayerViewHolder extends RecyclerView.ViewHolder{

    View mView;
    public PlayerViewHolder(View itemView){
        super(itemView);
        mView = itemView;
    }

    public void setPlayerName (String playerName){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewName);
        textViewName.setText(playerName);
    }
    public void setPlayerSurname (String playerSurname){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewSurname);
        textViewName.setText(playerSurname);
    }
    public void setPlayerPosition (String playerPosition){
        TextView textViewName = (TextView) mView.findViewById(R.id.textViewPosition);
        textViewName.setText(playerPosition);
    }
}

} }

Any help is appreciated. 任何帮助表示赞赏。 Thanks 谢谢

To display those players accordingly to the following database structure: 按照以下数据库结构显示这些播放器:

Goalkeepers
    Goalkeeper1
    Goalkeeper2
Defenders
    Defender1
    Defender2 

Please use the following code: 请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String typeOfPlayer = ds.getKey();
            Log.d("TAG", typeOfPlayer);

            DatabaseReference playerRef = playersRef.child(typeOfPlayer);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                        String player = dSnapshot.getKey();
                        Log.d("TAG", "    " + player);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            playerRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
playersRef.addListenerForSingleValueEvent(valueEventListener);

Edit: 编辑:

According to your edited post, please use the following code: 根据您编辑的帖子,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference playersRef = rootRef.child("Players");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String typeOfPlayer = ds.getKey();
            Log.d("TAG", typeOfPlayer);

            for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                String player = dSnapshot.getKey();
                Log.d("TAG", "    " + player);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
playersRef.addListenerForSingleValueEvent(valueEventListener);

Your result must be: 您的结果必须是:

Attackers
Defenders
Goalkeepers
    Goalkeeper1
Midfielders

Try this code .. 试试这个代码..

    private void readData(){
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    rootRef.child("Players").addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String typeOfPlayer = ds.getKey();
                Log.d("TAG", typeOfPlayer);

                for(DataSnapshot dSnapshot : dataSnapshot.child(typeOfPlayer).getChildren()) {
                    String player = dSnapshot.getKey();
                    Log.d("TAG", "    " + player);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

and i hope add internet permission into manifest file.. more information refer this link https://www.simplifiedcoding.net/firebase-realtime-database-crud/ 我希望将Internet权限添加到清单文件中。更多信息,请参见此链接https://www.simplifiedcoding.net/firebase-realtime-database-crud/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM