繁体   English   中英

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

[英]Android, Firebase - database only returns single child node as string when trying to retrieve multiple child nodes

我刚刚开始尝试在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,位置)并将其放入我的User对象,但实际上看起来好像它仅以字符串形式返回了第一个子节点(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));
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM