簡體   English   中英

用戶被添加到 Firebase Auth 但不是 Firebase 實時數據庫

[英]Users are added to Firebase Auth but not Firebase Realtime Database

我正在嘗試在我的 Android 應用程序中創建一個注冊頁面,但我已經為一個錯誤苦苦掙扎了幾天。 將用戶添加到 Firebase 時,它顯示在身份驗證頁面中,但實時數據庫保持清晰(未創建子項)...在第一次按下“注冊”按鈕時,用戶被添加到身份驗證但出於某種原因,沒有 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 (數據庫之一)。 第二次按下“Register”后,第一個if(task.isSuccessful())為 false,因此它轉到下面的else並彈出一個 toast(因為用戶已經創建並且位於 Firebase 的 Auth 頁面中)。 在第一次按下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)

出色地。 我發現了問題。 我使用的是 europe-west1 數據庫,而不是默認的 us-central1,顯然:

要獲取對 us-central1 默認 dstabase 以外的數據庫的引用,您必須將數據庫 URL 傳遞給 getInstance()(或 Kotlin+KTX database())。 對於 us-central1 默認數據庫,您可以在沒有 arguments 的情況下調用 getInstance()(或數據庫)。 您可以在 Firebase 控制台的實時數據庫部分找到您的實時數據庫 URL。 其格式為 https://.firebaseio.com(對於 us-central1 數據庫)或 https://.firebasedatabase.app(對於所有其他位置的數據庫)。

將我的實時數據庫 URL 添加到getInstance()中解決了我的問題。 示例: FirebaseDatabase.getInstance("https://XXXXXXXX.europe-west1.firebasedatabase.app/")

感謝@FrankvanPuffelen 提出問題!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM