首页 > 解决方案 > Android - 如何在 Firestore 中显示创建的用户

问题描述

我正在尝试在我的 firestore 数据库中显示创建的用户/用户信息,但我似乎无法得到它。我model已经创建了一个问题,每当提交新问题时都会显示该问题,但是当我尝试创建一个问题时user,该信息不会显示在数据库中。

理想情况下,当然,我希望数据库中有信息。我还想表明该问题是由作者创建的。

任何和所有的帮助表示赞赏。我一直在关注一系列教程,试图将它们全部混合以使我的代码正常工作,但我在这方面很挣扎。

到目前为止,这是我的相关代码:

SignUpActivity.java

private void registerUser() {

        final String email = editTextEmail.getText().toString().trim();
        final String userName = editTextUserName.getText().toString().trim();
        String password = editTextPassword.getText().toString().trim();
        final List<Question> questionsList = new ArrayList<>();

        final String firstName = "default firstName";
        final String lastName = "default lastName";    

        CollectionReference usersRef = FirebaseFirestore.getInstance().collection("Users");
        User userInfo = new User(userName, firstName, lastName, email, questionsList);
//        DocumentReference docPath = FirebaseFirestore.getInstance().document(mAuth.getCurrentUser()).
        userInfo.setUserName(userName);

            usersRef.add(userInfo);    

        mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                progressBar.setVisibility(View.GONE);
                if (task.isSuccessful()) {


                    CollectionReference usersRef = FirebaseFirestore.getInstance().collection("Users");
                    usersRef.add(new User(userName, firstName, lastName, email, questionsList));

                    FirebaseUser user = mAuth.getCurrentUser();

                    mAuthListener = new FirebaseAuth.AuthStateListener() {
                        @Override
                        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                            FirebaseUser user = firebaseAuth.getCurrentUser();
                            if (user != null) {
                                UserProfileChangeRequest profileChangeRequest = new UserProfileChangeRequest.Builder()
                                        .setDisplayName(userName).build();
                                user.updateProfile(profileChangeRequest);

                            }
                        }
                    };

                    mAuth.addAuthStateListener(mAuthListener); // need this to change info on Firebase Firestore

                    String usernameTest = user.getDisplayName();

                    Toast.makeText(SignUpActivity.this, "info saved hopefully", Toast.LENGTH_SHORT).show();

                    finish();
                    startActivity(new Intent(SignUpActivity.this, DashboardActivity.class));


                } else {

                    if (task.getException() instanceof FirebaseAuthUserCollisionException) {
                        Toast.makeText(getApplicationContext(), "You are already registered", Toast.LENGTH_SHORT).show();

                    } else {
                        Toast.makeText(getApplicationContext(), task.getException().getMessage(), Toast.LENGTH_LONG).show();
                    }
                }
            }
        });
    }

NewQuestionActivity.java

private void saveQuestion(){
        String questionString = questionEditText.getText().toString();
        String questionAnswerString = answerEditText.getText().toString();
        String authorFirebase = FirebaseAuth.getInstance().getCurrentUser().toString(); //TODO: HOW TO SET THIS Author
        authorTextView.setText(authorFirebase);

        int priority = numberPickerPriority.getValue();
        String tagInput = editTextTags.getText().toString();
        String[] tagArray = tagInput.split("\\s*, \\s*");
        List<String> tags = Arrays.asList(tagArray);
        if (questionString.trim().isEmpty() || questionAnswerString.trim().isEmpty()) {

            Toast.makeText(this, "Please insert a question and a proposed answer", Toast.LENGTH_SHORT).show();
            return;
        }
        CollectionReference questionRef = FirebaseFirestore.getInstance().collection("Questions");
        questionRef.add(new Question(questionString, questionAnswerString, priority, tags, authorFirebase));

        Toast.makeText(this, "Question Added", Toast.LENGTH_SHORT).show();
        finish();
    }

usermodel

package com.example.stairmaster.models;
import java.util.List;
import androidx.databinding.BaseObservable;
import com.google.firebase.firestore.Exclude;

public class User extends BaseObservable {

    @Exclude
    private int id;

    private String firstName;
    private String lastName;
    private String userName;
    private String email;
    private List<Question> questions;

    public User() {
        // no arg constructor needed
    }

    public User(String firstName, String lastName, String userName, String email, List<Question> questions) {

        this.firstName = firstName;
        this.lastName = lastName;
        this.userName = userName;
        this.email = email;
        this.questions = questions;

    }

    public int getId() {

        return id;
    }

    public String getUserName(String userName) { return userName;}


    public void setUserName(String userName) { this.userName = userName; }

    public String getFirstName(String firstName) {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName(String lastName) {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail(String email) {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Question> getQuestions() {
        return questions;
    }
}

问题是名字,并且没有在数据库中创建应有的姓氏。ID 不正确(我仍然不太确定将什么作为 ID 分配给用户以便他们唯一),问题列表是我仍然需要弄清楚的另一件事。

在此处输入图像描述

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


终于让它工作了。虽然我似乎唯一无法开始工作的是在创建用户ID时存储它,所以我必须稍后在某个地方这样做。

registerUser 下的代码现在如下所示:

        final CollectionReference usersColRef = FirebaseFirestore.getInstance().collection("Users");
        final User userInfo = new User(firstName, lastName, userName, userEmail, mAuthUserId);
        final DocumentReference userDocRef = usersColRef.document(userEmail);

        userDocRef.set(userInfo).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {

                mAuthUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
                userDocRef.update(
                        "firstname", firstName,
                        "lastname", lastName,
                        "userEmail", userEmail).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "onSuccess: userinfo was created");
                    }
                });
                Log.d(TAG, "onSuccess: user was created");

            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.d(TAG, "onFailure: failed to create user in signup" + e);
            }
        });

推荐阅读