检索多个子分支Firebase

时间:2018-04-23 15:56:38

标签: java android firebase firebase-realtime-database

好的,所以我让CardView持有一个数据库项目(在这种情况下是一个足球运动员)并在RecyclerView中对其进行了调整。 我的Firebase数据库如下所示:

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

我的数据库参考如下所示:

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

如果我将参考文献保留为("玩家"),它将为我提供4个空白字段,分别代表守门员,防御者,中场和攻击者分支。 如何显示所有位置分支的所有数据,如守门员,防守队员,中场和攻击者?

还有什么办法可以在我的布局中以有条理的方式显示所有玩家标题,这样看起来像这样吗?

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

这是来自实际应用的代码:

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);
    }
}

}

感谢任何帮助。感谢

2 个答案:

答案 0 :(得分:1)

根据以下数据库结构显示这些玩家:

df

   product_id  transaction_id category   color flag
0         234              54        A   black     
1         349              54        B  silver     
2         213              46        A  silver     
3         490              46        A   black     
4         245              87        A   black    X
5         249              87        B   black    X
6         294              87        A  silver    X

请使用以下代码:

Goalkeepers
    Goalkeeper1
    Goalkeeper2
Defenders
    Defender1
    Defender2 

修改

根据您编辑的帖子,请使用以下代码:

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);

您的结果必须是:

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);

答案 1 :(得分:0)

试试这段代码..

    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) {

        }
    });

}

我希望将互联网权限添加到清单文件中.. 更多信息请参考此链接 https://www.simplifiedcoding.net/firebase-realtime-database-crud/