为了账号安全,请及时绑定邮箱和手机立即绑定

Firebase 实时数据库 - 读取嵌套数据

Firebase 实时数据库 - 读取嵌套数据

小唯快跑啊 2022-01-12 16:06:25
我正在使用 firebase 做一个项目,能够在数据库中保存一些记录,但检索它对我来说一直是个问题,我已经干预了 SO 的其他帖子,但它们对我没有用。这是数据库的样子(一个例子):还有我检索数据的代码:private void readDataFromDB() {    databaseReference.child("users").addValueEventListener(new ValueEventListener() {        @Override        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {            User user = new User();            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {                user.setStrName(//Get the Name of the user);                user.setStrScore(//Get the Score of the user));            }        }        @Override        public void onCancelled(@NonNull DatabaseError databaseError) {        }    });}用户类:public class User {  String strName, strScore;  public String getStrName() {      return strName;  }  public void setStrName(String strName) {      this.strName = strName;  }  public String getStrScore() {      return strScore;  }  public void setStrScore(String strScore) {      this.strScore = strScore;  }}如何从每个特定用户那里获取名称和分数
查看完整描述

2 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

在您的代码中,您正在设置值,您需要使用 getter 检索值。


尝试以下操作:


databaseReference.child("users").addValueEventListener(new ValueEventListener() {

    @Override

    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            User user    = dataSnapshot.getValue(User.class);

            String name  = user.getStrName();

            String score = user.getStrScore();

    }


    @Override

    public void onCancelled(@NonNull DatabaseError databaseError) {


    }

});

但是,首先您需要将值添加到数据库示例中:


User user = new User();

user.setStrName("my_name");

user.setStrScore("20");


DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users");

ref.push().setValue(user);

注意setValue():


此外,您可以将您自己的类的实例设置到此位置,前提是它们满足以下约束:


类必须有一个不带参数的默认构造函数

该类必须为要分配的属性定义公共 getter。反序列化实例时,没有公共 getter 的属性将设置为其默认值

您需要向 POJO 类添加一个默认构造函数,并且该类中public User(){}的字段名称应与数据库中的字段名称匹配。所以把它String strName, strScore;改成这个String name, score;并再次生成getter和setter。


查看完整回答
反对 回复 2022-01-12
?
ITMISS

TA贡献1871条经验 获得超8个赞

您可以使用全局配置文件节点,而不是在每个节点中创建配置文件,并在其中存储配置文件数据及其 UID,这将使您更容易获取单个用户的详细信息。


-profile

  -UID1

    -name

    -score

  -UID2

    -name

    -score

检索时,您可以使用 getCurrentUser.getUid() 检索每个用户的数据:


 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

databaseReference.child("users").child("profile").child(uid).addValueEventListener(new ValueEventListener() {

    @Override

    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        User user = new User();


           user = dataSnapshot.getValue(User.class);


    }


    @Override

    public void onCancelled(@NonNull DatabaseError databaseError) {


    }

});


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 121 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信