【问题标题】:FirebaseFirestore add() method being executed before validation (get() documents) [duplicate]在验证之前执行 FirebaseFirestore add() 方法(get() 文档)[重复]
【发布时间】:2020-11-18 17:49:44
【问题描述】:

我正在构建一个应用程序并使用 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

【问题讨论】:

  • 您无法通过方法返回isValid[0]。 Firebase API 是异步的,您需要等待数据。所以请检查副本,看看如何使用自定义回调解决这个问题。

标签: android android-studio google-cloud-firestore


【解决方案1】:

你在哪里调用这些方法?

您可以只在 .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 完成后调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-20
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多