android - Firebase 的 exists() 函数行为突然
问题描述
我使用exists()
快照对象的方法Firebase
来检查用户是否在按下SignUp(register)
按钮时存在。但是只要我按下按钮,if 和 else 条件都会被执行(else first)。出了什么问题?
final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("users");
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
databaseReference.addValueEventListener(new ValueEventListener() {
public static final String TAG = "user_REG";
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.child(mobileNumber.getText().toString()).exists()){
Log.d(TAG, "onDataChange: if fired");
} else {
Log.d(TAG, "onDataChange: else fired");
if(confirmPass.getText().toString().trim().equals(userPass.getText().toString().trim())){
userModel userModel = new userModel(fullName.getText().toString(), userPass.getText().toString());
databaseReference.child(mobileNumber.getText().toString()).setValue(userModel);
Toast.makeText(user_reg.this, "Successfully Signed Up", Toast.LENGTH_SHORT).show();
finish();
} else {
Toast.makeText(user_reg.this, "Your Passwords do not match", Toast.LENGTH_SHORT).show();
}
}
}
解决方案
第一次mobileNumber
不存在,所以执行 else 部分并添加子节点值,并且在同一节点下添加数据时,onDataChange
将再次触发,这一次if
将执行部分。
为了防止onDataChange
调用两次,使用SingleEventListener
而不是ValueEventListener
像这样
databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = (String) dataSnapshot.getValue();
// do your stuff here with value
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
推荐阅读
- .htaccess - 如何使用 htaccess 从我的 url 网站中删除 ?id=,我已阅读并尝试过,但失败了
- css - 超出最大宽度的不可点击内容
- azure - Azure 事件中心触发函数应用 - 将消息发布到多个事件中心
- powershell - 在 Powershell 中运行并行加载到 Clickhouse Docker 容器中
- javascript - 如何拆分 JS 参数并忽略 \'
- docker - 如何在 Dockerfile 中将用户输入作为数字提供
- javascript - 使用 JavaScript 禁用打印屏幕、复制/粘贴和右键单击功能时遇到问题
- c++ - 为什么在使用带有指向接口的指针的多态行为时没有调用析构函数?
- javascript - AngularJS polyfill/Object.assign 的替代品
- sql - SQL 分组和擦除行