【问题标题】:Firebase: Check if any element has a specific property valueFirebase:检查是否有任何元素具有特定的属性值
【发布时间】:2018-02-09 20:55:41
【问题描述】:

我的 Firebase 数据库中有以下 JSON 结构:

- users
    |
    +--- key: 123 
    |     |
    |     +-----name : Tom
    |     +-----email: tom@mymail.com
    |
    +--- key: 456 
          |
          +-----name : Peter
          +-----email: peter@othermail.com

现在我想检查是否存在电子邮件tom@mymail.com 的用户。

我想:

DatabaseReference usersRef = db.getReference("users");
usersRef.orderByChild("email")
        .equalTo("tom@mymail.com")
        .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        //fires if exists
    }

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

但这只会在用户存在时触发,如果不存在则不会。怎么做才合适?

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:

我看到了两种解决方法:

  1. 加载整个用户列表并在设备上进行处理(如果您有大量用户,则不建议这样做,您可能会这样做)。我不会在这里发布代码,因为我害怕初学者会简单地复制并粘贴它并编写糟糕的应用程序......
  2. 创建一个包含注册用户电子邮件的节点(我们称之为userEmails):

    userEmails { "tom@mymail.com":true, "peter@othermail.com": true }

现在,为了检查用户是否存在:

usersRef.child("tom@mymail.com").addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if(dataSnapshot.exists()) {
                                    //User exists
                                }
                                else
                                {
                                    //User doesn't exist
                                }
                            }

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

这样做的缺点是,当新用户注册时,您必须将数据插入两个节点。

【讨论】:

  • 此方法的另一个挑战是密钥中不能有句点。如果您将电子邮件存储为密钥,则需要将句点替换为不同的字符。
  • @JenPerson 通常我们使用, 作为. 的替代品,因为-方便- 电子邮件地址不能包含,。 :-)
【解决方案2】:

您可以完全使用您提供的代码。 不管是否存在都会触发。你只需要在onDataChange()方法中检查数据是否存在即可:

DatabaseReference usersRef = db.getReference("users");
usersRef.orderByChild("email")
        .equalTo("tom@mymail.com")
        .addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()) {
           //exists!
        }
        else {
           //does not exist
        }
    }

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

我认为这行不通,我可以发誓我尝试过(可能是使用早期版本的 Firebase),但它确实有效!

【讨论】:

    猜你喜欢
    • 2022-06-25
    • 2019-04-30
    • 2020-07-05
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    相关资源
    最近更新 更多