简体   繁体   中英

How to retrieve data from firebase realtime database and display it in profile dashboard

So I'm trying to display the data related to the user that has logged in but the data related to it is returning me null I've tried multiple solutions but it didn't work

public class HomeViewModel extends ViewModel {

private MutableLiveData<String> mText;
DatabaseReference userdata;
String namedata;

public HomeViewModel() {
    userdata = FirebaseDatabase.getInstance().getReference();

    userdata.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snap : dataSnapshot.getChildren()){
                User user = snap.getValue(User.class);
                namedata = user.getUserId();

            }
        }

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

        }
    });
    mText = new MutableLiveData<>();
    mText.setValue("Welcome back! " +namedata);
}

public LiveData<String> getText() {
    return mText;
}}`

在此处输入图片说明

here is the User.class I want to get those data and display it in the views

public class User {
String userId;
String userPhone;
String userGender;

public User() {

}

public User(String userId, String userPhone, String userGender) {
    this.userId = userId;
    this.userPhone = userPhone;
    this.userGender = userGender;
}



public String getUserId() {
    return userId;
}

public String getUserPhone() {
    return userPhone;
}

public String getUserGender() {
    return userGender;
}}

You have to call the "userId"

@Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()){
                    HashMap<String, String> map = (HashMap<String, String>) snap.getValue();
                    if (map.containsKey("userId")) {
                        if (map.get("userId").equals("william henry")) {
                            String userGender = map.get("userGender");
                        }
                    }
                }
            }

or

@Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snap : dataSnapshot.getChildren()){
                    HashMap<String, String> map = (HashMap<String, String>) snap.getValue();
                    if (map.containsKey("userId")) {
                        String userGender = map.get("userId");
                    }
                }
            }

first FirebaseDatabase.getInstance().getReference() point to your root ( which is the link above your database).so you need to point to what you want to get ( which is User tree). Second of all,you must set your data inside onDataChange cause it not synchonize function ( mean your name data is always not follow the data return from onDataChange)

 FirebaseDatabase.getInstance().getReference().child("User").orderByChild("userId").equalTo(*your_logged_in_user_id*).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        Iterator iterator = dataSnapshot.getChildren().iterator()
        if(iterator.hasNext()){
            User user = iterator.next().getValue(User.class)
            }
                name = user.getName();
            }

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

        }
    });

You are getting null because you are not fetching value from correct node. There are child of users and you want to get values of child of user .

userdata = FirebaseDatabase.getInstance().getReference().child("User");
userdata.addOnChildEventListener( new ChildEventListener() {

                @Override
                public void onChildAdded(DataSnapshot snap, String previousChildName) {
                //get value here.
                  User user = snap.getValue(User.class);
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {

                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {

                }

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

You want to get single user data then userdata = FirebaseDatabase.getInstance().getReference().child("User").child(userIdOfthatuser);

userdata.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snap) {

                User user = snap.getValue(User.class);
                namedata = user.getUserId();


        }

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

        }
    });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM