У меня проблемы с получением данных из базы данных Firebase в реальном времени в строковые переменные - PullRequest
0 голосов
/ 26 марта 2020

Мой код, как показано ниже ... Я новичок в этой строке, поэтому любая помощь приветствуется.

@Override
    public void onStart() {
        super.onStart();

        FirebaseRecyclerOptions<Contacts> options = new FirebaseRecyclerOptions.Builder<Contacts>().setQuery(ChatsRef, Contacts.class).build();
        FirebaseRecyclerAdapter<Contacts, ChatsViewHolder> adapter = new FirebaseRecyclerAdapter<Contacts, ChatsViewHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final ChatsViewHolder holder, int position, @NonNull Contacts model) {
                final String usersIDs = getRef(position).getKey();
                final String[] retImage = {"default_image"};

                UsersRef.child(usersIDs).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists())  {
                            if (dataSnapshot.hasChild("image")) {
                                retImage[0] = dataSnapshot.child("image").getValue().toString();
                                Picasso.get().load(retImage[0]).into(holder.profileImage);
                            }

                            final String retName = dataSnapshot.child("name").getValue().toString();

                            holder.userName.setText(retName);

                            if (dataSnapshot.child("userState").hasChild("state")) {
                                String state = dataSnapshot.child("userState").child("state").getValue().toString();

                                if (state.equals("online")) {
                                    holder.onlineIcon.setVisibility(View.VISIBLE);
                                }
                                else if (state.equals("offline")) {
                                    holder.onlineIcon.setVisibility(View.INVISIBLE);
                                }
                            }

                            else {
                                holder.onlineIcon.setVisibility(View.INVISIBLE);
                            }

// i am having trouble from this portion onwards

                            final String[] retLastMessage = {null};
                            final String[] retLastMessageTime = {null};
                            final String[] retLastMessageDate = {null};

                            RootRef.child("Contacts").child(currentUserID).child(usersIDs).addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                                    if (dataSnapshot.hasChild("LastMessage")) {
                                        retLastMessage[0] = dataSnapshot.child("LastMessage").getValue().toString();
                                        retLastMessageTime[0] = dataSnapshot.child("LastMessageTime").getValue().toString();
                                        retLastMessageDate[0] = dataSnapshot.child("LastMessageDate").getValue().toString();
                                    }
                                }

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

                            holder.userLastMessage.setText(retLastMessage[0]);

                            String retLastMessageTimeDate = retLastMessageTime[0] + " " + retLastMessageDate[0];

                            holder.userLastMsgTime.setVisibility(View.VISIBLE);
                            holder.userLastMsgTime.setText(retLastMessageTimeDate);
//upto this I guess


                            holder.itemView.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View view) {
                                    Intent chatIntent = new Intent(getContext(), ChatActivity.class);
                                    chatIntent.putExtra("visit_user_id", usersIDs);
                                    chatIntent.putExtra("visit_user_name", retName);
                                    chatIntent.putExtra("visit_image", retImage[0]);
                                    startActivity(chatIntent);
                                }
                            });
                        }
                    }

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

                    }
                });
            }

            @NonNull
            @Override
            public ChatsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.users_display_layout, viewGroup, false);
                return new ChatsViewHolder(view);
            }
        };
        chatsList.setAdapter(adapter);
        adapter.startListening();
    }

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

Ответы [ 2 ]

0 голосов
/ 26 марта 2020

после небольшого изменения кода приложение работало гладко

измененный код:


                            final String[] retLastMessage = {null};
                            final String[] retLastMessageTime = {null};
                            final String[] retLastMessageDate = {null};

                            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Contacts").child(currentUserID).child(usersIDs);

                            reference.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                    if (dataSnapshot.hasChild("LastMessage")) {
                                        retLastMessage[0] = dataSnapshot.child("LastMessage").getValue().toString();
                                        retLastMessageTime[0] = dataSnapshot.child("LastMessageTime").getValue().toString();
                                        retLastMessageDate[0] = dataSnapshot.child("LastMessageDate").getValue().toString();

                                        holder.userLastMessage.setVisibility(View.VISIBLE);
                                        holder.userLastMessage.setText(retLastMessage[0]);
                                        String retLastMessageTimeDate = retLastMessageTime[0] + " " + retLastMessageDate[0];

                                        holder.userLastMsgTime.setVisibility(View.VISIBLE);
                                        holder.userLastMsgTime.setText(retLastMessageTimeDate);
                                    }
                                }

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

                                }
                            });

остальная часть кода остается прежней. проблема заключалась в том, что я присваивал значения после ValueEventListener. Я не знаю правильную причину, но Астер присваивает значения внутри ValueEventLister код, кажется, работает нормально.

0 голосов
/ 26 марта 2020

as shown in the picture attached to my answer you need to access 1 first, 2 and then 3 or 4.

Так что вам нужно сделать это:

    DatabaseReference reference = 
     FirebaseDatabase.getInstance().getReference("Contacts").child("2").child("3");

    // of course you are not going to use 2 and 3 as a child but it's just to illustrate my point

    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {



        }

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

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