Java 从Firebase中嵌套保存的数据检索数据

Java 从Firebase中嵌套保存的数据检索数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我有这样的结构: 我需要从在线客户那里获取数据。我的尝试: currentDriverId = mFireBaseAuth.getCurrentUser().getUid(); mDataBase = FirebaseDatabase.getInstance().getReference().child("Users").child("Driver").child(currentDriverId).child("OnlineClients"); final ArrayList<Studen

我有这样的结构:

我需要从在线客户那里获取数据。我的尝试:

currentDriverId = mFireBaseAuth.getCurrentUser().getUid();
mDataBase = FirebaseDatabase.getInstance().getReference().child("Users").child("Driver").child(currentDriverId).child("OnlineClients");
final ArrayList<Student> users = new ArrayList<>();
        ValueEventListener postListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot data : dataSnapshot.getChildren()) {
                    Student student  = data.getValue(Student.class);
                    users.add(student);
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                // Getting Post failed, log a message
            }
        };
        mDataBase.addListenerForSingleValueEvent(postListener);
已经尝试过:类似的,但没有成功

注意:我只需要从当前登录用户检索OnlineClient,这就是我使用currentDriverId的原因。

更改此选项:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
  for (DataSnapshot data : dataSnapshot.getChildren()) {
      Student student  = data.getValue(Student.class);
      users.add(student);
   }

}
为此:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
  Student student  = dataSnapshot.getValue(Student.class);
  users.add(student);
}
删除for循环,因为在循环时,将以字符串形式检索值。另外,请确保在使用setValue时添加了Student类型的对象作为参数

检索值的另一种方法是执行以下操作:

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot data : dataSnapshot.getChildren()) {
    String firstName = data.child("FirstName").getValue(String.class);
    String lastName  = data.child("LastName").getValue(String.class);
     }
}

代码中的问题在于,StudentStreetNumber字段是在String类型的学生类中声明的,而在数据库中是一个长数字。要解决此问题,只需将属性的类型更改为long:

代码中的另一个问题是getter。要解决这个问题,请参阅以下帖子中的答案:


请添加您的学生课程内容。@AlexMamo补充说是这样的!实际上,我在一个类中有不一致的地方,它被声明为int,然后可能被转换为long,在另一个类中则被转换为String。没有必要更改我当前的代码,但要修复这些不一致的地方。很高兴听到它起作用了。如果你认为我的回答也有助于未来的FialBasic开发者,请考虑投票表决。我会很感激的。谢谢
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
 for (DataSnapshot data : dataSnapshot.getChildren()) {
    String firstName = data.child("FirstName").getValue(String.class);
    String lastName  = data.child("LastName").getValue(String.class);
     }
}
private long StudentStreetNumber;