Firebase数据库:如何获取密钥并加入?

时间:2019-07-26 06:44:42

标签: java android firebase firebase-realtime-database

我想使用Firebases数据库中存储的数据来创建重复的回收站视图,但是问题是我必须加入并且不知道该如何做。

Database Nodes

我想在“请求者”键值下获取数据,并且希望使用用户键数据。我想做的是仅在请求者用户ID下找到并获取数据全名和图像。

也许需要加入?我该怎么办?

这是我在请求者下获取数据的片段

package com.example.together.fragment;


public class PetchingLoungeFragment extends Fragment {

    private static final String TAG = "PetFirendsFragment";

    RecyclerView recyclerView;
    PetchingLoungeAdapter petchingLoungeAdapter;
    List<Lounge> requestorUserList;
    FirebaseUser firebaseUser;



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {

        Log.d(TAG, "분양키 리스트 목록처음"+requestorUserList);

        View view =  inflater.inflate(R.layout.fragment_pet_firends, container, false);

        recyclerView = view.findViewById(R.id.recycler_view);
        recyclerView.setHasFixedSize(true);



        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("PetchingBunyang").child(firebaseUser.getUid()).child("Requestor");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot)
            {


                for (DataSnapshot childSnapshot : dataSnapshot.getChildren())
                {
                    Lounge lounge = childSnapshot.getValue(Lounge.class);
                    String key = childSnapshot.getKey();

                    Log.d(TAG, "라운지키"+key);

                    //각 신청키
                    lounge.setRequestorId(key);

                    requestorUserList.add(lounge);

                    Log.d(TAG, "신청자키: "+requestorUserList);
                    Log.d(TAG, "신청: "+lounge);


                }


                Collections.reverse(requestorUserList);
                petchingLoungeAdapter.notifyDataSetChanged();

            }

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

            }
        });



        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(linearLayoutManager);
        requestorUserList = new ArrayList<>();
        petchingLoungeAdapter = new PetchingLoungeAdapter(getContext(), requestorUserList);
        recyclerView.setAdapter(petchingLoungeAdapter);



        return view;


    }


}

这是我的回收站视图适配器

package com.example.together.adapter;

public class PetchingLoungeAdapter extends RecyclerView.Adapter<PetchingLoungeAdapter.MyViewHolder> {


    private static final String TAG = "PetchingBunyangAdapter";

    FirebaseUser firebaseUser;
    DatabaseReference reference;

    Context mContext;
    List<Lounge> mLounge;

    public PetchingLoungeAdapter(Context mContext, List<Lounge> mLounge) {
        this.mContext = mContext;
        this.mLounge = mLounge;
    }



    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(mContext).inflate(R.layout.list_petching_lounge, parent, false);
        return new PetchingLoungeAdapter.MyViewHolder(view);

    }

    @Override
    public void onBindViewHolder(MyViewHolder viewHolder, int position)
    {

        final Lounge lounge = mLounge.get(position);
        getRequestorUserInfo(lounge.getRequestorId(), viewHolder.img_requestor, viewHolder.requestor_name);



        viewHolder.img_requestor.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Intent intent = new Intent(v.getContext(), PetchingBunyangDetailInfo.class);

               // intent.putExtra("petBunyangId",mUser.get(position).getPetBunyangId());

                mContext.startActivity(intent);


            }
        });

    }

    @Override
    public int getItemCount()
    {
        return mLounge.size();
                //mPetchingLounge.size();
    }



    public class MyViewHolder extends RecyclerView.ViewHolder
    {

        public Button allow, refuse;
        public ImageView img_requestor;
        public TextView requestor_name;

        public MyViewHolder(View itemView)
        {
            super(itemView);

            img_requestor = itemView.findViewById(R.id.img_requestor);

            allow = itemView.findViewById(R.id.allow);
            refuse = itemView.findViewById(R.id.refuse);

            requestor_name = itemView.findViewById(R.id.requestor_name);


        }
    }



    // 펫 정보 이름, 나이, 견종, 성별,
    private void getRequestorUserInfo(String petbunyangid, final ImageView imageView, final TextView petName)
    {


        firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid()).child("Requestor").child(petbunyangid);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                Lounge lounge = dataSnapshot.getValue(Lounge.class);

                lounge.getRequestorId();

            }

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

            }
        });

    }



}

3 个答案:

答案 0 :(得分:1)

尝试以下操作:

java

首先添加对子项nohup的引用,然后在其内部循环两次以获取具有值DatabaseReference reference = FirebaseDatabase.getInstance().getReference("PetchingBunyang").child(firebaseUser.getUid()).child("Requestor"); DatabaseReference userReference = FirebaseDatabase.getInstance().getReference("Users"); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot datas: dataSnapshot.getChildren()){ for(DataSnapshot ds : datas.getChildren()){ String id = ds.getKey(); userReference.child(id).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { String fullName = dataSnapshot.child("fullname").getValue(String.class); String imageUrl = dataSnapshot.child("imageUrl").getValue(String.class); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); } }); } } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); } }); 的{​​{1}}。然后,在检索Requestor之后,向节点userid添加另一个引用,并检索该用户的数据。

答案 1 :(得分:1)

您有2个选择: 1.获取所有用户列表并映射数据。 2.为每个用户ID添加get查询。

我更喜欢选项2。

摘要:

  List<UserBean> userBeanList= new  ArrayList<>();
    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("PetchingBunyang").child(firebaseUser.getUid()).child("Requestor");
    reference.addSingleValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            //got all the list of the user ids 
            //userList is array of String which contains all userIds

            for (String userid : userList) {
                FirebaseDatabase.getInstance().getReference("Users").child(userid).addSingleValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        //got all the list of the user ids
                        //
                    }

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

                    }
                });
            }
        }

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

        }
    });

答案 2 :(得分:0)

您实际上正在做的是获取节点“ Users”中的用户列表。顺便问一下,什么是“休息室”对象?您需要澄清这一点(给出该类的代码)。无论如何,据我了解,您需要这样做:

private void getRequestorUserInfo(String petbunyangid, final ImageView imageView, final TextView petName) {


    firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(firebaseUser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot lounge : dataSnapshot.getChildren()) {
                Lounge retrievedLounge = lounge.getValue(Lounge.class);
                retrievedLounge.getRequestorId(); //This is the id you are looking for.
                retrievedLounge.getName(); //These are functions that may be in your lounge class.
                retrievedLounge.getPhotUrl();
            }

        }

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

        }
    });

}

说实话,我不完全理解您的问题,因为英语有点...您知道这很奇怪。没关系,这是我认为您遇到的问题的代码。希望对您有所帮助:)