Java Android,Firebase-在尝试检索多个子节点时,数据库仅将单个子节点作为字符串返回

Java Android,Firebase-在尝试检索多个子节点时,数据库仅将单个子节点作为字符串返回,java,android,database,firebase,firebase-realtime-database,Java,Android,Database,Firebase,Firebase Realtime Database,我刚刚开始尝试在我的Android应用程序中使用Firebase。我可以将数据写入数据库,但在尝试检索数据时遇到了问题。 我的数据库结构如下 我检索数据的方法: public void getCurrentUserData() { FirebaseDatabase database = FirebaseDatabase.getInstance(); FirebaseUser loggedUser = firebaseAuth.getCurrentUser()

我刚刚开始尝试在我的Android应用程序中使用Firebase。我可以将数据写入数据库,但在尝试检索数据时遇到了问题。

我的数据库结构如下


我检索数据的方法:

public void getCurrentUserData() {

        FirebaseDatabase database = FirebaseDatabase.getInstance();
        FirebaseUser loggedUser = firebaseAuth.getCurrentUser();
        String uid = loggedUser.getUid();

        DatabaseReference userRef = database.getReference().child("Users").child(uid);

        userRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                //crashes because user is not a string
                //User user = dataSnapshot.getValue(User.class);

                //works because function is returning first child of uID as a string
                String user = dataSnapshot.getValue().toString();
            }

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

            }
        });

    }

调试时:

dataSnapshot = "DataSnapshot { key = bio, value = test }"

我原以为这会返回uid中包含的所有子节点(bio、dob、firstName、joinDate、lastName、location)并将它们放入我的用户对象中,但实际上它看起来似乎只是以字符串形式返回第一个子节点(bio)。


为什么会发生这种情况?如何检索完整的子节点集?

非常感谢您的帮助。谢谢。

如果要获取用户的所有属性,您需要创建一个自定义Java类来表示该用户,或者需要在自己的代码中从各个子快照中读取属性。例如:

userRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        String firstName = dataSnapshot.child("firstName").getValue(String.class);
        String lastName = dataSnapshot.child("lastName").getValue(String.class);
        ...
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        throw databaseError.toException(); // don't ignore errors
    }
});
或者,您可以使用以下命令循环属性:

userRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot propertySnapshot: dataSnapshot.getChildren()) {
            System.out.println(propertySnapshot.getKey()+": "+propertySnapshot.getValue(String.class));
        }
    }

DataSnapshot
应该在侦听器所在的客户端已知的位置包含数据。由于您使用的是
addListenerForSingleValueEvent
,因此我立即怀疑这是来自本地磁盘缓存的。那么:你在使用磁盘持久性吗?我不知道?我已更改“bio”中包含的数据并重新运行该应用程序,它总是更新。您可以发布您的用户类吗?可能是其中的某些内容与Firebase不兼容。您的用户类中是否缺少空的默认构造函数?这曾经是我的一个问题。@FrankvanPuffelen海报上说他试图“把它们放到我的用户对象中”。我想他注释掉了这一行,以尝试不会崩溃的字符串版本。但对我来说,他的最终目标似乎是让Firebase返回用户对象。。。我的一个价值观缺失了一个设定者:/谢谢你的帮助