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

标签 java android firebase firebase-realtime-database

我正在用 firebase 做一个项目,能够在数据库中保存一些记录,但检索它对我来说是个问题,我已经干预了 SO 的其他帖子,但它们对我没有用。这是数据库的样子(一个例子):

enter image description here

以及我检索数据的代码:

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

如何获取每个特定用户的姓名和分数

最佳答案

在您的代码中,您正在设置值,您需要使用 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() :

In addition, you can set instances of your own class into this location, provided they satisfy the following constraints:

  1. The class must have a default constructor that takes no arguments
  2. The class must define public getters for the properties to be assigned. Properties without a public getter will be set to their default value when an instance is deserialized

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

关于java - Firebase 实时数据库 - 读取嵌套数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53249652/

相关文章:

java - android 4 中 webview.db 为空

angular - 尝试使用 Google/Facebook 登录时出现 Firebase 错误 "auth/argument-error"

java - TextView.setText(int resid)

java - for 循环值或引用

android - 使用 Android AccountManager 的 Firebase 身份验证

android - 当我尝试在任何其他 Activity 中访问当前用户时,Firebase 数据仅在登录 Activity 中从数据库中检索,它给出 null

ios - 类型 'AuthDataResult' 的值没有成员 'isEmailVerification'

java - 如何使用 SnakeYaml 读取字符串列表

java - 有没有办法用 Selenium 获取影子根中的元素信息?

android - ActionBar.selectTab 在紧凑模式下不刷新微调器