【问题标题】:how to get a user structure known only his email Firebase Realtime如何让用户结构只知道他的电子邮件 Firebase Realtime
【发布时间】:2018-02-25 12:19:02
【问题描述】:

我有一个包含子“用户”的实时数据库。这个孩子有不同的用户。 每个用户都有一堆这样的属性:user(email,name,age,phonenumber,gender)。

我使用带有唯一生成 ID 的 push 函数将它们分开:

所以我的问题是:我想知道我只有他的电子邮件地址的特定用户的所有属性。

我已经尝试过这个查询,但我不知道它是如何工作的

    reference.orderByChild("email").equalTo(email

【问题讨论】:

  • 假设reference 是一个指向您的用户节点的DatabaseReference,这个查询应该可以正常工作。你得到了什么结果?

标签: java android firebase firebase-realtime-database


【解决方案1】:

要显示该数据,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("users").orderByChild("email").equalTo(email);
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            String age = ds.child("age").getValue(String.class);
            //and so on
            Log.d("TAG", name + " / " + age);
        }
    }

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

这是在 logcat 中显示 nameage 的示例。以同样的方式,您还可以获得其他值。

【讨论】:

    【解决方案2】:

    你可以试试这个:-

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("User");
    databaseReference.orderByChild("email").equalTo(email).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                String email = dataSnapshot.child("email").getValue(String.class);
                String age = dataSnapshot.child("age").getValue(String.class);
                String fullName = dataSnapshot.child("fullName").getValue(String.class);
                String gender = dataSnapshot.child("gender").getValue(String.class);
                String phone_number = dataSnapshot.child("phone_number").getValue(String.class);
        }
    
        @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) {
            Log.d("TAG", "error is " + databaseError.getMessage());
        }
    });
    

    请通过此链接了解有关从 Firebase 检索数据的更多信息

    Retrieving Data From Firebase

    【讨论】:

    • 不需要遍历客户端中的所有子节点来查找具有匹配电子邮件地址的子节点(并且非常浪费用户的带宽)。 databaseReference.orderByChild("email").equalTo(email).addChildEventListener 会解决这个问题。
    • @FrankvanPuffelen 哦,没想到性能,谢谢指出:)
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 1970-01-01
    • 2021-04-13
    • 2017-01-05
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多