Java 如何在Firebase中获取整个对象?

Java 如何在Firebase中获取整个对象?,java,android,firebase,firebase-realtime-database,firebase-authentication,Java,Android,Firebase,Firebase Realtime Database,Firebase Authentication,我正在使用Firebase数据库创建应用程序这是我的数据结构: { "teachers" : { "USYSacnOjDR5EAPwljZMHtggN9I2" : { "name" : { "teacher_name" : "Alison" }, "members": { "sIrfMA3bm0R9uj55nDUFpFyabcL2" : true } } }, "users" : {

我正在使用Firebase数据库创建应用程序这是我的数据结构:

{
  "teachers" : {
    "USYSacnOjDR5EAPwljZMHtggN9I2" : {
      "name" : {
        "teacher_name" : "Alison"
      },
      "members": {
        "sIrfMA3bm0R9uj55nDUFpFyabcL2" : true
      }
    }
  },
  "users" : {
    "sIrfMA3bm0R9uj55nDUFpFyabcL2" : {
      "position" : {
        "bpos" : "0"
      },
      "name" : {
        "email" : "m@m.com",
        "name" : "John",
        "surname" : "Clash"
      }
    }
因此,现在在
RecyclerView
中,我试图显示所有
Alison
教师成员,如您所见
John Clash
设置为
true
。无论如何,当我尝试以这种方式检索用户时:

    reference = FirebaseDatabase.getInstance().getReference("teachers").child(teacherkey).child("members");
reference.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.add(user);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.child("name").getValue(User.class);
                result.remove(user);
                adapter.notifyDataSetChanged();
            }
应用程序因NPE而崩溃,datasnapshot密钥有效,它是John的帐户密钥,但快照的值为
true
。我如何解决这个问题并从John的数据
姓名
姓氏

@编辑: 以下是我的检索代码:

 public void updateList() {
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String userId = ds.getKey();
                    DatabaseReference userIdRef = FirebaseDatabase.getInstance().getReference().child("users").child(userId);
                    userIdRef.addChildEventListener(new ChildEventListener() {
                        @Override
                        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                            User user = dataSnapshot.child("name").getValue(User.class);
                            result.add(user);
                            adapter.notifyDataSetChanged();

                        }

                        @Override
                        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                        }

                        @Override
                        public void onChildRemoved(DataSnapshot dataSnapshot) {

                        }

                        @Override
                        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

                }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

您有两种方法来解决此问题:

a、 )在onChildAdded中,如果您得到的值为true,则在数据库中进行另一次搜索,但这次是在“用户”节点中。差不多

newReference = FirebaseDatabase.getInstance().getReference("users").child(dataSnapshot.getKey).child("name")

b、 )在“成员”节点中,写入“John Clash”而不是“true”。此方法目前仍有效,但如果有一天您还需要检索电子邮件地址,您将使用第一种方法解决此问题

您有两种方法:

a、 )在onChildAdded中,如果您得到的值为true,则在数据库中进行另一次搜索,但这次是在“用户”节点中。差不多

newReference = FirebaseDatabase.getInstance().getReference("users").child(dataSnapshot.getKey).child("name")

b、 )在“成员”节点中,写入“John Clash”而不是“true”。这种方法目前还可以,但如果有一天您还需要检索电子邮件地址,您将使用第一种方法来解决这个问题,您需要查询数据库两次。请参阅下面的代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference membersRef = rootRef.child(teachers).child(teacherId).child("members");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userId = ds.key();

            DatabaseReference userIdRef = rootRef.child("users").child(userId);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    User user = dataSnapshot.getValue(User.class);
                    Log.d("TAG", user.getName());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            userIdRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
membersRef.addListenerForSingleValueEvent(valueEventListener);

要解决这个问题,需要查询数据库两次。请参阅下面的代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference membersRef = rootRef.child(teachers).child(teacherId).child("members");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userId = ds.key();

            DatabaseReference userIdRef = rootRef.child("users").child(userId);
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    User user = dataSnapshot.getValue(User.class);
                    Log.d("TAG", user.getName());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            userIdRef.addListenerForSingleValueEvent(eventListener);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
membersRef.addListenerForSingleValueEvent(valueEventListener);

如前所述,json无效,将json结构粘贴到此处,您将看到缺少某些点如前所述,json无效,将json结构粘贴到此处,您将看到缺少某些点选项b。是正确的,选项a。听起来不错,谢谢:)选项b。是正确的,选项a。听起来不错,谢谢:)这应该被标记为答案,这正是你需要的!谢谢@GastónSaillén!看起来不错,但还有一个问题。。所以它看起来很有效,它读取所有特定的用户数据,但是,当要将其置于
recyclerview
应用程序崩溃并显示此错误
com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为
类型时,是否确实使用了正确的
数据库引用
?删除此子项->
.child(“名称”)
。这应该标记为答案,这正是您需要的!谢谢@GastónSaillén!看起来不错,但还有一个问题。。所以它看起来很有效,它读取所有特定的用户数据,但是,当要将其放入
recyclerview
应用程序崩溃并显示此错误
com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为
类型时,是否确定使用了正确的
数据库引用
?删除此子对象->
.child(“名称”)