【问题标题】:Users are added to Firebase Auth but not Firebase Realtime Database用户已添加到 Firebase 身份验证,但未添加到 Firebase 实时数据库
【发布时间】:2021-08-12 07:59:54
【问题描述】:

我正在尝试在我的 Android 应用程序中创建一个注册页面,但我已经为一个错误苦苦挣扎了几天。 将用户添加到 Firebase 时,它​​会显示在 Auth 页面中,但实时数据库保持清晰(未创建子节点)... 在第一次按下“注册”按钮时,用户被添加到身份验证中,但由于某种原因,没有显示 Toast。 在第二次按下时,弹出一个 Toast 说“注册失败”(因为该帐户已经创建)。

如何将用户添加到数据库?我的代码有问题吗?

代码如下:

private void registerUser() {
    final String email = edEmail.getText().toString().trim();
    final String password = edPassword.getText().toString().trim();
    final String confirmPassword = edConfirmPassword.getText().toString().trim();

    if (email.isEmpty()) {
        edEmail.setError("An Email is required!");
        edEmail.requestFocus();
        return;
    }

    if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
        edEmail.setError("Please provide a valid Email!");
        edEmail.requestFocus();
        return;
    }

    if (password.isEmpty()) {
        edPassword.setError("A password is required!");
        edPassword.requestFocus();
        return;
    }

    if (password.length() < 8) {
        edPassword.setError("The password is too short!");
        edPassword.requestFocus();
        return;
    }

    if (!password.equals(confirmPassword)) {
        edConfirmPassword.setError("The passwords in both fields must match!");
        edConfirmPassword.requestFocus();
        return;
    }


    mAuth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull @NotNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    User user = new User(email, password);
                    FirebaseDatabase.getInstance().getReference("Users")
                        .child(FirebaseAuth.getInstance().getCurrentUser().getUid())
                        .setValue(user)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull @NotNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(RegisterPage.this, "User has been registered successfully", Toast.LENGTH_LONG).show();
                                    Log.i("RegisterPage", "User has been registered successfully");
                                    goToLoginPage();
                                } else {
                                    Toast.makeText(RegisterPage.this, "Failed to register user!", Toast.LENGTH_LONG).show();
                                    Log.i("RegisterPage", "Failed to register user!");
                                }
                            }
                        });
                } else {
                    Toast.makeText(RegisterPage.this, "Failed to register!", Toast.LENGTH_LONG).show();
                    Log.i("RegisterPage", "Failed to register!");
                }
            }
    });
}

第一次按“注册”后,进入第一个if(task.isSuccessful()),表示任务成功。然后它只是跳过第二个OnComplete(数据库之一)。第二次按下“注册”后,第一个if(task.isSuccessful()) 为假,因此它转到下面的else 并弹出一个祝酒词(因为用户已经创建并且位于 Firebase 上的身份验证页面中)。第一次按下task.getException() 后什么都不返回,第二次后它返回:

2021-05-24 02:37:00.678 24492-24492/com.fulminatix.gymlog W/RegisterPage: createUserWithEmail:failure
    com.google.firebase.auth.FirebaseAuthUserCollisionException: The email address is already in use by another account.
        at com.google.android.gms.internal.firebase-auth-api.zzto.zza(com.google.firebase:firebase-auth@@21.0.1:25)
        at com.google.android.gms.internal.firebase-auth-api.zzuw.zza(com.google.firebase:firebase-auth@@21.0.1:9)
        at com.google.android.gms.internal.firebase-auth-api.zzux.zzl(com.google.firebase:firebase-auth@@21.0.1:1)
        at com.google.android.gms.internal.firebase-auth-api.zzuu.zzk(com.google.firebase:firebase-auth@@21.0.1:25)
        at com.google.android.gms.internal.firebase-auth-api.zztl.zzh(com.google.firebase:firebase-auth@@21.0.1:1)
        at com.google.android.gms.internal.firebase-auth-api.zzoc.zza(com.google.firebase:firebase-auth@@21.0.1:2)
        at com.google.android.gms.internal.firebase-auth-api.zzvb.zza(com.google.firebase:firebase-auth@@21.0.1:23)
        at com.google.android.gms.internal.firebase-auth-api.zzul.zzn(com.google.firebase:firebase-auth@@21.0.1:4)
        at com.google.android.gms.internal.firebase-auth-api.zzpt.zzl(com.google.firebase:firebase-auth@@21.0.1:5)
        at com.google.android.gms.internal.firebase-auth-api.zztp.zzg(com.google.firebase:firebase-auth@@21.0.1:8)
        at com.google.android.gms.internal.firebase-auth-api.zzqg.accept(com.google.firebase:firebase-auth@@21.0.1:3)
        at com.google.android.gms.common.api.internal.zacj.doExecute(com.google.android.gms:play-services-base@@17.1.0:2)
        at com.google.android.gms.common.api.internal.zaf.zac(com.google.android.gms:play-services-base@@17.1.0:6)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zac(com.google.android.gms:play-services-base@@17.1.0:167)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zab(com.google.android.gms:play-services-base@@17.1.0:139)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zabg(com.google.android.gms:play-services-base@@17.1.0:99)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zabe(com.google.android.gms:play-services-base@@17.1.0:40)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.onConnected(com.google.android.gms:play-services-base@@17.1.0:19)
        at com.google.android.gms.common.internal.zaf.onConnected(com.google.android.gms:play-services-base@@17.1.0:2)
        at com.google.android.gms.common.internal.BaseGmsClient$zzg.zzj(com.google.android.gms:play-services-basement@@17.1.0:24)
        at com.google.android.gms.common.internal.BaseGmsClient$zza.zza(com.google.android.gms:play-services-basement@@17.1.0:12)
        at com.google.android.gms.common.internal.BaseGmsClient$zzb.zzo(com.google.android.gms:play-services-basement@@17.1.0:11)
        at com.google.android.gms.common.internal.BaseGmsClient$zzc.handleMessage(com.google.android.gms:play-services-basement@@17.1.0:49)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at com.google.android.gms.internal.common.zzi.dispatchMessage(com.google.android.gms:play-services-basement@@17.1.0:8)
        at android.os.Looper.loop(Looper.java:246)
        at android.os.HandlerThread.run(HandlerThread.java:67)

【问题讨论】:

  • 如果你在if (task.isSuccessful()) { 上都设置了断点并在调试器中运行,它应该在其中一行或两行上停止。从那里逐步执行代码,并检查需要哪个分支。也不是说如果任务失败,它的task.getException() 会返回有关失败原因的详细信息——这在这里可能非常有用。
  • 感谢您的回复!第一次按“注册”后,进入第一个if(task.isSuccessful()),表示任务成功。然后它只是跳过第二个OnComplete(数据库之一)。第二次按下“注册”后,第一个if(task.isSuccessful()) 为假,因此它转到下面的else 并弹出一个祝酒词(因为用户已经创建并且位于 Firebase 上的身份验证页面中)。第一次按下 task.getException() 后什么都不返回,第二次按下后它返回:SHOWN IN THE QUESTION BECAUSE ITS TOO LONG@FrankvanPuffelen
  • 1) 我建议只关注第一次运行。由于您希望这会成功,因此第二次运行提供(预期)问题的事实并不相关。 2) 你是否在内部if(task.isSuccessful()) 上设置了断点?如果它从未到达该断点,这通常意味着数据库 SDK 无法到达其后端服务器。
  • 我做到了。它永远不会到达它......那么我该如何解决它?我在我的应用程序级别build.gradle 中有implementation 'com.google.firebase:firebase-database',我可以在 Firebase 的网站上看到数据库树(它只是空的..)@FrankvanPuffelen
  • 我测试了数据库,但它没有在 Firebase 中记录信息。 FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference myRef = database.getReference("message"); myRef.setValue("Hello, World!"); @FrankvanPuffelen

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

嗯。我发现了问题。 我使用的是 europe-west1 数据库,而不是默认的 us-central1,显然:

要获取对 us-central1 默认 dstabase 以外的数据库的引用,您必须将数据库 URL 传递给 getInstance()(或 Kotlin+KTX database())。对于 us-central1 默认数据库,您可以不带参数调用 getInstance()(或数据库)。 您可以在 Firebase 控制台的实时数据库部分找到您的实时数据库 URL。它的格式为 https://.firebaseio.com(对于 us-central1 数据库)或 https://.firebasedatabase.app(对于所有其他位置的数据库)。

将我的实时数据库 URL 添加到 getInstance() 解决了我的问题。 例子: FirebaseDatabase.getInstance("https://XXXXXXXX.europe-west1.firebasedatabase.app/")

感谢@FrankvanPuffelen 提出问题!

【讨论】:

    猜你喜欢
    • 2019-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2019-09-27
    • 2020-01-27
    • 1970-01-01
    • 2018-08-18
    • 2020-04-13
    相关资源
    最近更新 更多