【问题标题】:Retrieve data from nested saved data in Firebase从 Firebase 中的嵌套保存数据中检索数据
【发布时间】:2019-07-15 16:36:03
【问题描述】:

我有这个结构:

我需要从“OnlineClients”获取数据。我的尝试:

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

有错误:

com.google.firebase.database.DatabaseException:转换失败 java.lang.Long 类型的值到 String

学生.班级:

public class Student {
    private String FirstName;
    private String LastName;
    private String StudentSchool;
    private String StudentState;
    private String StudentStreet;
    private String StudentStreetNumber;


    public Student(){
    }

    public String getFirstName() {
        return FirstName;
    }

    public void setFirstName(String firstName) {
        FirstName = firstName;
    }

    public String getLastName() {
        return LastName;
    }

    public void setLastName(String lastName) {
        LastName = lastName;
    }

    public String getStudentSchool() {
        return StudentSchool;
    }

    public void setStudentSchool(String studentSchool) {
        StudentSchool = studentSchool;
    }

    public String getStudentState() {
        return StudentState;
    }

    public void setStudentState(String studentState) {
        StudentState = studentState;
    }

    public String getStudentStreet() {
        return StudentStreet;
    }

    public void setStudentStreet(String studentStreet) {
        StudentStreet = studentStreet;
    }

    public String getStudentStreetNumber() {
        return StudentStreetNumber;
    }

    public void setStudentStreetNumber(String studentStreetNumber) {
        StudentStreetNumber = studentStreetNumber;
    }
}

已经尝试过:how to retrieve all the data within nested firebase database 和类似但没有成功。

注意:我只需要从当前登录的用户那里检索“OnlineClients”(这就是我只使用 currentDriverId 的原因)。

【问题讨论】:

  • 请添加你的Student类的内容。
  • @AlexMamo 添加了

标签: java android firebase firebase-realtime-database


【解决方案1】:

改变这个:

@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 循环,因为当您循环时,您检索的值是 String。还要确保在使用 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);
     }
}

【讨论】:

    【解决方案2】:

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

    private long StudentStreetNumber;
    

    您的代码中的另一个问题是吸气剂。要解决这个问题,请查看我在以下帖子中的回答:

    【讨论】:

    • 就是这样!实际上我有不一致的地方(在一个类中它被声明为 int,然后可能被转换为 long,而在另一个类中被声明为 String)。没有必要更改我当前的代码,而是修复这些不一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2017-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多