【问题标题】:Create New Document For Every New User为每个新用户创建新文档
【发布时间】:2021-08-01 23:47:13
【问题描述】:

现在,我正在进行一项活动,用户必须在 EditText 中输入他们的名字、姓氏和 ID。他们输入的值会保存到 Firestore 控制台中。这是我的问题:

我打开我的应用并使用我的 google 帐户登录 google,让我们将此帐户称为我的主要帐户。我填写了 3 个 EditTexts,然后按下我命名为“btnNextStep”的保存按钮(因为它旨在将您带到表单的下一部分,但现在它是“保存”按钮)。按保存后,我可以在 Google Firestore 上看到我填写的数据。现在,如果我要在同一设备上登录另一个 Google 帐户,请将其称为我的辅助帐户,然后我会填写 EditTexts。一旦我按下保存,而不是在 Firestore 中创建新文档,它会覆盖主帐户的数据。 Firestore 的最终产品是它保存了辅助帐户中的数据,但主帐户中的数据现在已经消失了。

这是我的 .java 文件的代码,用于此活动:

package com.example.attenda_attempt3;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.firestore.FirebaseFirestore;

import org.jetbrains.annotations.NotNull;

import java.util.HashMap;
import java.util.Map;

public class StudentInformationFormActivity extends AppCompatActivity {

    Button btnNextStep;
    EditText etFirstName;
    EditText etLastName;
    EditText etSchoolID;

    FirebaseFirestore db = FirebaseFirestore.getInstance();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student_information_form);

        btnNextStep = findViewById(R.id.btnNextStep);
        etFirstName = findViewById(R.id.etFirstName);
        etLastName = findViewById(R.id.etLastName);
        etSchoolID = findViewById(R.id.etSchoolID);

        btnNextStep.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String firstName = etFirstName.getText().toString();
                String lastName = etLastName.getText().toString();
                String schoolID = etSchoolID.getText().toString();

                Map<String, Object> data = new HashMap<>();
                data.put("First Name", firstName);
                data.put("Last Name", lastName);
                data.put("School ID", schoolID);


                db.collection("Users").document("User Information").set(data)
                        .addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void unused) {
                                Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_SHORT).show();
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull @NotNull Exception e) {
                                Toast.makeText(getApplicationContext(), "Error Occurred, Data Not Saved", Toast.LENGTH_SHORT).show();
                            }
                        });
            }
        });

    }
}

有人可以帮我制作,这样每次用户按下“btnNextStep”时,它都会创建一个新文档并保存数据。

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    您需要为每个用户生成一个唯一的 ID 并将其输入此行:

    db.collection("Users").document("uniqueUserId").set(data)
    

    如果您使用 Firebase 身份验证,它会自动为每个用户生成这样一个唯一的用户 ID。但是由于您没有使用任何现有的用户管理 API(这很好),您需要自己生成 ID,将其与数据库中的用户相关联,如上所示,还可能将其存储在本地存储中(如SharedPreferences) 可以在应用重启时恢复它。

    【讨论】:

    • 我使用 Firebase 身份验证来设置我所做的 google 登录活动。在这种情况下,我将如何使用 firebase 身份验证?
    • 如果每个用户都需要写入自己的数据,您可以通过String uid = FirebaseAuth.getInstance().getCurrentUser().getUid() 获取uid,然后db.collection("Users").document(uid).set(data) 将他们的数据写入个人文档。在这种情况下,另请参阅有关如何保护访问的文档:firebase.google.com/docs/rules/basics#content-owner_only_access
    • 哇,伙计!有用!你真的为我节省了很多时间,而且它完全按照我的意愿工作。谢谢!
    猜你喜欢
    • 2021-04-02
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多