首页 > 解决方案 > 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添加用户后进入

标签: androidandroid-studiogoogle-cloud-firestore

解决方案


你在哪里调用这些方法?

您可以在.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


推荐阅读