java - 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 分配给用户以便他们唯一),问题列表是我仍然需要弄清楚的另一件事。
解决方案
终于让它工作了。虽然我似乎唯一无法开始工作的是在创建用户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);
}
});
推荐阅读
- reactjs - TurboModuleRegistry.getEnforcing(...):找不到“NativeReanimated”
- git - 从 git 历史记录中确定父分支/提交
- python - 熊猫,计算每组的值?
- image - GCP - Google Cloud Platform - 从快照问题创建实例
- validation - 验证字段以接受 Access 中的 PT 或 FT
- docker - Traefik 容器标签
- midi - 从停止的设备获取当前的 MIDI 时间码
- linux - 空间不足时暂停/暂停进程?
- c++ - 如何创建仅在一台计算机上运行 InnoSetup 的安装程序以防止未经授权的复制
- signalr - 具有 Signalr(服务器端风格)的 Blazor 应用程序在部署到 IIS 后返回错误请求