无法检查Firebase中是否存在子项

时间:2017-10-25 14:02:16

标签: java android firebase

我到处寻找解决方案,但我还没找到。我在检查Firebase上是否存在子项时遇到问题。在我的情况下,对于每个独特的用户,我在他第一次打开应用程序时创建了一个sixDigitCode。所以每当我创建这个sixDigitCode时,我想检查Firebase上是否已经存在sixDigitCode。因此,如果存在,我可以创建一个新的,直到sixDigitCode是唯一的。到目前为止,我已经编写了这段代码但它最终会产生无限循环的无限数量的sixDigitCode,并且永远不会调用onDataChanged。你能帮我么?谢谢。

boolean itDoesntExist;

String sixDigitCode;

void addNewUserOnFb() {

    FirebaseDatabase database = FirebaseDatabase.getInstance();

    DatabaseReference users = database.getReference("users");


    do {

        sixDigitCode = getSixDigitCode(); //Function that returns random six digit code


    users.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {
            if (snapshot.hasChild(sixDigitCode)) {
                // run some code

                itDoesntExist = false;

            } else {

                itDoesntExist = true;

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    } while (itDoesntExist == false)


    //Do some more code

}

2 个答案:

答案 0 :(得分:0)

您应该使用UID作为用户节点内的密钥或其格式化的电子邮件,以便它可以是数据库的有效密钥,如下所示:

String key = mAuth.getInstance().getCurrentUser().getEmail().replace(".","_").replace("@","_");

假设您使用的是Firebase身份验证,并且仅允许经过身份验证的用户写入您的数据库

您似乎对Firebase的异步方法感到困惑。看看文档

您可以通过以下方式检查用户是否存在:

ref.child(key).addSingleValueEventListener(listener);

Listener是ValueEventListener的一个实例。你将覆盖

@Override
onDataChange(DataSnapshot snap){
if(snap.exists()){
  //Your user exist no need to create one.
}
else{
//do your logic
   }
}

答案 1 :(得分:0)

一方面我在一个循环上放置了Asyncronous执行,但我没有调用onDataChanged的原因是我没有公开读取。那个细节花了这么多小时。现在它工作正常。谢谢您的反馈!问题解决了。