通常,当我检查数据库是否包含节点时,我会执行以下操作:
users = dbReference.getReference("users").child(someUser);
我不使用hasChild()
因为我知道在大型数据集上这可能需要一些时间来查询。但是,最近我遇到了方法exists()
found here on documentation,现在我只是想知道这与我只是检查快照是否为空有什么不同? exists()
函数如何工作?与hasChild()
一样,迭代数据集esists()
做什么?
它比检查null更好吗?文档没有多说
感谢
更新1
假设我有以下节点:
当用户想要注册时,我会检查此节点以查看是否采用了用户名:
userTakenNode.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.hasChild(enteredUsername)) {
register();
}
}
如果未使用用户名,则我使用该用户名注册用户并将用户名添加到上面的节点。现在我使用hasChild()来理解我的理解,虽然这将迭代整个节点,直到它找到它并将返回它,否则不会返回任何东西。在大型数据集上,这可能需要很长时间。
有更快捷的方法来查询数据集吗?
答案 0 :(得分:1)
答案 1 :(得分:0)
您肯定只想检查特定的用户名。所以将你的监听器放在树的下层一级:
userTakenNode.child(enteredUsername).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!dataSnapshot.exists) {
register();
}
}
但总的来说,这种情况更适合于transaction,它结合了获取节点的当前值并将其新值设置为单个操作。