【问题标题】:How can I get node name while I am using orderByChild in Firebase?在 Firebase 中使用 orderByChild 时如何获取节点名称?
【发布时间】:2016-11-10 06:35:13
【问题描述】:

这是我的代码:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    Query queryRef  = mdatabase.child("Users").orderByChild("age");
    queryRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            for (DataSnapshot chatSnapshot: snapshot.getChildren()) {
                User users = chatSnapshot.getValue(User.class);
                String name = users.getName();
                System.out.println(name);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });        // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_home, container, false);
}

你们可能已经猜到了,这段代码用于显示用户名。但我真正想做的是,基于相同的查询结果,我想显示他们的用户 ID,而不是名称。我尝试使用这样的类来获取用户 ID:

public class User{
private String gender;
private Long age;
private String email;
private Long height;
private Long weight;
private String name;
private String type;
private String userId;

public User()
{

}
public User(String gender,Long age,String email,Long height,Long weight,String name,String type,String userId)
{
    this.gender=gender;
    this.age=age;
    this.email=email;
    this.height=height;
    this.weight=weight;
    this.name=name;
    this.type=type;
    this.userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
}

public String getId()
{
    return userId;
}

public String getGender()
{
    return gender;
}

public Long getAge()
{
    return age;
}

public String getEmail()
{
    return email;
}

public Long getHeight()
{
    return height;
}

public Long getWeight()
{
    return weight;
}

public String getName()
{
    return name;
}

public String getType()
{
    return type;
}}

但这会返回 3 次当前用户 ID,因为我的数据库中有 3 个用户,而不是单个用户 ID。 这是我的数据库:

每个用户都有这么多价值

我尝试的另一种方法是像这样使用 getKey():

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) {

Query queryRef  = mdatabase.child("Users").orderByChild("age");
queryRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot chatSnapshot: snapshot.getChildren()) {
            String name = snapshot.getKey();
            System.out.println(name);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});        // Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_home, container, false);
}

但这会返回节点“用户”3 次,而不是用户 ID。

谁能帮我解决这个问题?我想显示他们的用户 id。也就是说,这些:

OMbACIWg3fOurXy8SEqQD8TAQl12, kZllc0GL1Vfbitt73WHWwJuXvXC2, lxVykDo9GQRcFmb0u1QZ0WCc9lg2 (根据图片)

非常感谢任何帮助。谢谢。

【问题讨论】:

    标签: java android firebase firebase-realtime-database nosql


    【解决方案1】:

    您在错误的DataSnapshot 处调用了getKey() 方法。 这就是你想要的

    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot chatSnapshot: snapshot.getChildren()) {
            String key = chatSnapshot.getKey();
            System.out.println(key);
        }
    }
    

    编辑:将 userId 设置为 User

    for (DataSnapshot chatSnapshot: snapshot.getChildren()) {
        User user = chatSnapshot.getValue(User.class);
        user.setUserId(chatSnapshot.getKey());
    }
    

    【讨论】:

    • 谢谢!它现在完美运行! :D 只是出于好奇,有没有办法使用我在问题中提到的类来获取 UserId?
    • 不可能,必须手动设置。我已经更新了我的答案。 @JacobCelestine
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多