0

For some reason, the following function always returns 0. Does someone know why?

public int GetOnlineFriendsNum(){
    OnlineFriendsCounter = 0;
    database.getReference().child("users").child(mAuth.getCurrentUser().getPhoneNumber()).child("Friends").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot snap : snapshot.getChildren()) {
                String friend = snap.getValue().toString();
                database.getReference().child("users").child(friend).child("IsHome").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapboolean) {
                      if((boolean)snapboolean.getValue()){
                          OnlineFriendsCounter++;
                      }
                    }

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

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

    return OnlineFriendsCounter;
}

I added a firebase tree image^^

Laurel
  • 5,965
  • 14
  • 31
  • 57
  • 1
    There is no way you can return `OnlineFriendsCounter` as a result of method. Firebase API is asynchronous. So please check the duplicate to see how can you solve this using a callback. You might also be interested in reading this [resource](https://medium.com/firebase-tips-tricks/how-to-read-data-from-firebase-realtime-database-using-get-269ef3e179c5). – Alex Mamo Jul 14 '22 at 11:22
  • Yes @AlexMamo you were right, also he was using 'snap.getValue().toString();' that will be a whole string not a key (Mobile Number) – Ashvin solanki Jul 14 '22 at 11:54

1 Answers1

0

No need for another value change event, You can convert it to your model directly or parse using map.

for (DataSnapshot snap : snapshot.getChildren()) {
                    HasMap<String,Object> friends = snap.getValue();
                    
                    for (String mobileNumber : friends .keySet()) 
                    {
                        HasMap<Strin,Object> friend = friends.get(mobileNumber);
                        if(friend.get("IsHome").toString().equals("true"))
                        {
                           OnlineFriendsCounter++;
                        }
                    }
}
Ashvin solanki
  • 4,802
  • 3
  • 25
  • 65