Firebase:检查是否有任何元素具有特定的属性值

时间:2017-08-31 20:06:05

标签: java android firebase firebase-realtime-database

我的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) {                            
    }
});

但这只会在用户存在时触发,而如果不存在则触发。怎么做得好?

2 个答案:

答案 0 :(得分: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的早期版本),但它有效!

答案 1 :(得分:1)

我认为有两种方法可以解决这个问题:

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

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

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

    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) {}
                            });
    

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