【问题标题】:How to retrieve data from firebase realtime database and display it in profile dashboard如何从 firebase 实时数据库中检索数据并将其显示在配置文件仪表板中
【发布时间】:2020-01-03 15:44:53
【问题描述】:

所以我试图显示与已登录用户相关的数据,但与之相关的数据返回 null 我尝试了多种解决方案,但没有成功

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;
}}`

这是我想要获取这些数据并将其显示在视图中的 User.class

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;
}}

【问题讨论】:

  • 首先,请提供您的 User.class
  • 我有一个 User 类我很抱歉我没有包含它我要编辑它

标签: java android firebase firebase-realtime-database


【解决方案1】:

你必须调用“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");
                        }
                    }
                }
            }

@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");
                    }
                }
            }

【讨论】:

    【解决方案2】:

    你得到 null 因为你没有从正确的节点获取值。有用户的孩子,您想获取 用户的孩子的值。

    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) {
                    }
                });
    

    然后您想获取单个用户数据 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) {
    
            }
        });
    

    【讨论】:

      【解决方案3】:

      首先FirebaseDatabase.getInstance().getReference() 指向您的根目录(即数据库上方的链接)。因此您需要指向您想要获取的内容(即用户树)。 其次,你必须在 onDataChange 中设置你的数据,因为它没有同步功能(意味着你的名字数据总是不跟随从 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) {
      
              }
          });
      

      【讨论】:

      • your_id 是什么?
      • 它仍然返回 null
      • @Liam 你能显示你的数据树吗?因为也许用户有另一个父根
      • @Liam 或 ifu 无法显示,只需指向使用 child("path_name") 直到它指向用户并喜欢我的回答
      • 实际上,您应该使用“FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();”将用户配置文件的根密钥保存到 FirebaseAuth 生成的密钥中所以每次你需要喜欢 ....child("User").child(user.getId)
      猜你喜欢
      • 1970-01-01
      • 2018-04-01
      • 2020-05-09
      • 1970-01-01
      • 2018-02-26
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      相关资源
      最近更新 更多