我意识到这里已经提出了类似的问题,但以前的解决方案似乎并不适用。我正在使用Firebase身份验证开发Android应用,我正在尝试跟踪通过Firebase数据库注册的用户句柄。这与Tanishq Sharma对firebase duplicate username and custom sign-in的回答非常相似。
我的问题是从不调用ValueEventListener的onDataChange方法。正如弗兰克范普弗伦在Firebase with java (non-android) retrive information中所建议的,我试图增加一些等待时间,但这并没有解决问题。等待时间过后,始终调用onCancelled方法。
下面的代码显示了如果用户句柄在节点" takeHandles"的Firebase数据库中列出,则该函数应返回true。我知道与数据库的连接正常,因为我能够通过我的代码的另一部分向数据库添加新句柄而没有任何问题。关于什么可能导致这个问题的任何建议?
编辑似乎我没有权限对我自己的问题发表评论。谢谢弗兰克,快速回复!这确实解释了为什么写入数据库的工作原理,因为我在新用户通过身份验证后就这样做了。我应该考虑更改数据库规则。
public boolean handleTaken(final String mHandle) {
final boolean[] isTaken = new boolean[]{true};
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference takenHandles = database.getReference("takenHandles");
takenHandles.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Log.d(TAG, "ValueEventListener: onDataChange");
isTaken[0] = dataSnapshot.hasChild(mHandle);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.d(TAG, "ValueEventListener: onCancelled");
Toast.makeText(MyAccountActivity.this, "Connection error, please try again", Toast.LENGTH_SHORT).show();
}
});
try {
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return isTaken[0];
}