我到处寻找解决方案,但我还没找到。我在检查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
}
答案 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的原因是我没有公开读取。那个细节花了这么多小时。现在它工作正常。谢谢您的反馈!问题解决了。