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

时间:2018-11-11 14:22:26

标签: 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) {

        }
    });
}

User类:

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 个答案:

答案 0 :(得分:2)

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

  

此外,您可以将自己的类的实例设置在此位置,只要它们满足以下约束:

     
      
  1. 该类必须具有不带参数的默认构造函数
  2.   
  3. 该类必须为要分配的属性定义公共获取方法。反序列化实例时,没有公共获取器的属性将设置为其默认值
  4.   

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

答案 1 :(得分:0)

您可以使用全局配置文件节点,而不是在每个节点中创建配置文件,并在其中存储配置文件数据及其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) {

    }
});