0

I need to get the value of another child in my Firebase database inside addChildEventListener but addValueEventListener won't get triggered. Meaning that user_name_list will always be empty. How Can I solve this issue? Thanks!

mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
                mess_list = new ArrayList<>();
                chat_id_list = new ArrayList<>();
                user_name_list = new ArrayList<>();
                for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
                    chat_id_list.add(String.valueOf(uniqueKey.getKey()));
                    mess_list.add(String.valueOf(uniqueKey.getValue()));
                    
                    mDatabase2 = FirebaseDatabase.getInstance().getReference();
                    mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                            user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
                        }

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

                list_fonct(mess_list, chat_id_list, user_name_list);
            }
            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, String s) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, String s) {
            }

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

This is the structure of my database.

{
  "all_ads" : {
    "companies" : {
      "VchGVZITqVVJMAcrI8bJ1WLxPdq2" : {
        "ads" : {
          "1_ad" : {
            "chat" : [ null, {
              "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "Hi!"
            }, {
              "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "hello"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "a"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "b"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "c"
            } ]
          }
        }
      }
    }
  },
  "usersacc" : {
    "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : {
      "username" : "username1"
    },
    "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : { 
      "username" : "username2"
    }
  }
}
Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
gh1354
  • 3
  • 2
  • Can you share an screenshot of your database or .json file? – Adrixb Jun 15 '21 at 11:04
  • @SirGery I added the structure of the database. – gh1354 Jun 15 '21 at 11:27
  • First of all, do your variables `company_id` and `ad_id` get a value? And why don't you try with `ValueEventListener` instead of `ChildEventListener`? – Adrixb Jun 15 '21 at 11:37
  • @SirGery Yes ```company_id``` and ```ad_id``` have values. I tried with ```addValueEventListener``` instead of ```addChildEventListener``` but It didn't work also. The second ```ValueEventListener``` won't trigger – – gh1354 Jun 15 '21 at 11:50
  • Have you tried to log the errors? – Alex Mamo Jun 15 '21 at 13:08

1 Answers1

0

The problem is not so much that your ValueEventListener isn't getting triggered, but that you call list_fonct before that happens.

I'll include some links at the bottom to learn more about this, but for now the simple fix is to move the call to list_fonct into the onDataChange that is called one the user data is loaded:

mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
        mess_list = new ArrayList<>();
        chat_id_list = new ArrayList<>();
        user_name_list = new ArrayList<>();
        for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
            chat_id_list.add(String.valueOf(uniqueKey.getKey()));
            mess_list.add(String.valueOf(uniqueKey.getValue()));
            
            mDatabase2 = FirebaseDatabase.getInstance().getReference();
            mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                    user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
                    list_fonct(mess_list, chat_id_list, user_name_list); //  moved here
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    throw databaseError.toException(); //  never ignore errors
                }
            }); 
        }
    }

Also see:

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807