Firebase存在()vs null

时间:2017-02-06 04:09:10

标签: android firebase firebase-realtime-database

通常,当我检查数据库是否包含节点时,我会执行以下操作:

users = dbReference.getReference("users").child(someUser);

我不使用hasChild()因为我知道在大型数据集上这可能需要一些时间来查询。但是,最近我遇到了方法exists() found here on documentation,现在我只是想知道这与我只是检查快照是否为空有什么不同? exists()函数如何工作?与hasChild()一样,迭代数据集esists()做什么?

它比检查null更好吗?文档没有多说

感谢

更新1

假设我有以下节点:

example node

当用户想要注册时,我会检查此节点以查看是否采用了用户名:

userTakenNode.addListenerForSingleValueEvent(new ValueEventListener() {


        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if (!dataSnapshot.hasChild(enteredUsername)) {
                register();
            } 

        }

如果未使用用户名,则我使用该用户名注册用户并将用户名添加到上面的节点。现在我使用hasChild()来理解我的理解,虽然这将迭代整个节点,直到它找到它并将返回它,否则不会返回任何东西。在大型数据集上,这可能需要很长时间。

有更快捷的方法来查询数据集吗?

2 个答案:

答案 0 :(得分:1)

存在效率稍高:

  

如果此DataSnapshot包含任何数据,则返回true。它比使用snapshot.val()!== null。

更有效

Firebase exists documentation

答案 1 :(得分:0)

您肯定只想检查特定的用户名。所以将你的监听器放在树的下层一级:

userTakenNode.child(enteredUsername).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (!dataSnapshot.exists) {
            register();
        } 
    }

但总的来说,这种情况更适合于transaction,它结合了获取节点的当前值并将其新值设置为单个操作。