android - FirebaseFirestore add() 方法在验证之前执行(get() 文档)
问题描述
我正在构建一个应用程序并使用 Firestore 创建用户集合。在将新用户添加到集合之前,我需要在集合中检查电子邮件是否已在使用中,为此我构建了两种方法:一种用于阅读集合以查找具有该电子邮件的用户,另一种用于添加新用户如果一切正常。但无论我做什么,add 方法总是首先执行导致验证无用。我想这与 Firebase 的方法优先级有关,但我真的无法退出解决方案
这是两种方法第一个是验证,第二个是添加
private boolean createFirestoreUser(final String identificador) {
final boolean[] isValid = {true};
FirebaseFirestore.getInstance().collection("Usuarios")
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot document : task.getResult()) {
if(identificador.equals(document.getString("identificador")))
isValid[0] = false;
}
}
});
return isValid[0];
}
private void createUser(Usuario novoUsuario) {
FirebaseFirestore.getInstance().collection("Usuarios")
.add(novoUsuario)
.addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(final DocumentReference documentReference) {
documentReference
.update("id", documentReference.getId())
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
loginSessionManager.createLoginSession(documentReference.getId());
loginSessionManager.checkLogin(this.getClass());
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
}
});
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
snackbar.showMensagemLonga(v,e.getMessage());
}
});
}
无论我在按钮侦听器上使用的顺序如何,第二个总是首先被调用。我已经调试过,它确实在isValid[0] = false
添加用户后进入
解决方案
你在哪里调用这些方法?
您可以在.addOnSuccessListener
这种方式中调用 createUser ,直到返回验证后才会调用它。
就像是:
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
for (QueryDocumentSnapshot document : task.getResult()) {
if(identificador.equals(document.getString("identificador")))
isValid[0] = false;
else
createUser(novoUsuario)
}
}
我问你在哪里调用这些方法的原因是因为你的变量默认情况下可能是 true ,这将在异步侦听器返回之前触发第二个函数,因此在进行验证之前调用第二个方法。
因此,替代方法是在您正在验证的同一个方法中调用 register 方法,或者如果我假设您首先声明了一个布尔值以查看您是否调用 create 方法,只需将其设为 false 作为默认值并确保在异步完成后调用它.OnCompleteLister
。
推荐阅读
- android - 分片内容进入PictureInPictureMode()
- angularjs - 如何在 ng-repeat 中使用范围变量进行计算 角JS
- angular - 剑道角度图表并排
- python-3.x - python中的颜色图使用外部文件
- curl - groovy 脚本中的问题 - 没有文件或目录错误消息
- bash - bash 传递数组作为对函数的引用被破坏
- c++ - 编译代码 C++ 时出错
- ruby - 如何在 Ruby 中为 Google Calendar API 授权服务帐户?
- java - Spring JSR-303 ConstraintValidator 不支持 list.add()
- java - 从另一个映射值更新一个映射键