我的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) {
}
});
但这只会在用户存在时触发,而如果不存在则触发。怎么做得好?
答案 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)
我认为有两种方法可以解决这个问题:
创建一个包含已注册用户的电子邮件的节点(让我们称之为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) {}
});
这样做的缺点是,当注册新用户时,您必须在两个节点中插入数据。