【问题标题】:Cant save data into Firestore无法将数据保存到 Firestore
【发布时间】:2021-10-15 08:19:13
【问题描述】:

这是所有使用电子邮件密码注册帐户的代码,保存验证电子邮件,将用户数据保存到 Firestore 数据库。只有 Firestore 数据库无法运行。

fAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if(task.isSuccessful()){

            // send verification link

            FirebaseUser fuser = fAuth.getCurrentUser();
            fuser.sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(register.this, "Verification Email Has been Sent.", Toast.LENGTH_SHORT).show();
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, "onFailure: Email not sent " + e.getMessage());
                }
            });

            Toast.makeText(register.this, "User Created.", Toast.LENGTH_SHORT).show();
            userID = fAuth.getCurrentUser().getUid();
            DocumentReference documentReference = fStore.collection("users").document(userID);
            Map<String,Object> user = new HashMap<>();
            user.put("fName",fullName);
            user.put("email",email);
            user.put("phone",phone);
            documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "onSuccess: user Profile is created for "+ userID);
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "onFailure: " + e.toString());
                }
            });
            startActivity(new Intent(getApplicationContext(),MainActivity.class));

        }
        

否则{ Toast.makeText(register.this, "Error !" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); progressBar.setVisibility(View.GONE); } } }); } });

【问题讨论】:

  • 请编辑您的问题并将代码添加为文本,添加为图像。
  • 已编辑,firebase中的身份验证是可行的,但我想将用户数据存储到firestore中它不起作用。
  • 即使我添加了日志,但在 logcat 中也没有显示任何内容
  • rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { 允许读取,写入:如果 request.auth != null; } } }
  • 这是我的 Firestore 规则

标签: java android firebase google-cloud-firestore


【解决方案1】:

Firebase 身份验证操作是异步的。这意味着您可以确保仅当onSuccess() 方法触发时验证成功。由于您说身份验证过程成功完成,因此触发了您的第一个onSuccess()。您的第二个onSuccess() 没有被触发,因为与向 Firestore 添加数据相对应的代码在回调之外,因此存在这种行为。为了解决这个问题,回调之外的所有代码都应该移动到第一个 onSuccess() 中,如下面的代码行所述:

fAuth
.createUserWithEmailAndPassword(email,password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
    @Override
    public void onComplete(@NonNull Task<AuthResult> task) {
        if(task.isSuccessful()){

            // send verification link

            FirebaseUser fuser = fAuth.getCurrentUser();
            fuser.sendEmailVerification().addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(register.this, "Verification Email Has been Sent.", Toast.LENGTH_SHORT).show();

                    Toast.makeText(register.this, "User Created.", Toast.LENGTH_SHORT).show();

                    //Moved code ???
                    userID = fAuth.getCurrentUser().getUid();
                    DocumentReference documentReference = fStore.collection("users").document(userID);
                    Map<String,Object> user = new HashMap<>();
                    user.put("fName",fullName);
                    user.put("email",email);
                    user.put("phone",phone);
                    documentReference.set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Log.d(TAG, "onSuccess: user Profile is created for "+ userID);
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Log.w(TAG, "onFailure: " + e.toString());
                        }
                    });
                    startActivity(new Intent(getApplicationContext(),MainActivity.class));

                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.d(TAG, "onFailure: Email not sent " + e.getMessage());
                }
            });
        } else {
            Toast.makeText(register.this, "Error ! " + task.getException().getMessage(), Toast.LENGTH_SHORT).show();
            progressBar.setVisibility(View.GONE);
        }
    }
});

通过这种方式,您可以在身份验证过程完成后将数据写入 Firestore。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多