Не выводится нужная информация из базы данных Firebase в TextView
Я регистрирую пользователя, после чего вся введенная им информация записывается в базу данных Firebase. Человек при авторизации сразу попадает на страницу профиля, где ему должна выводится его имя и фамилия, но у меня не получается это реализовать, либо поле TextView остается с дефолтным текстом, который я ввел при создании TextView (делал через hint), либо это приводит к различным ошибкам. Ниже прикрепляю все свои классы.
Вот так выглядит БД
Класс с регистрацией пользователя
package com.example.finaljournalstudent;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Patterns;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class signup extends AppCompatActivity implements View.OnClickListener {
Button back_main, register_reg;
EditText email_str, first_name_str, last_name_str, middle_name_str, phone_str, password_str;
FirebaseAuth mAuth;
DatabaseReference mRef;
FirebaseDatabase mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signup);
mDatabase = FirebaseDatabase.getInstance();
mAuth = FirebaseAuth.getInstance();
mRef = FirebaseDatabase.getInstance().getReference("Users");
findViewById(R.id.button_register).setOnClickListener(this);
findViewById(R.id.button_back).setOnClickListener(this);
email_str = findViewById(R.id.email_reg);
first_name_str = findViewById(R.id.first_name_reg);
last_name_str = findViewById(R.id.last_name_reg);
middle_name_str = findViewById(R.id.middle_name_reg);
phone_str = findViewById(R.id.password_reg);
password_str = findViewById(R.id.password_reg);
}
private void registerUser() {
String email = email_str.getText().toString().trim();
final String first_name = first_name_str.getText().toString().trim();
String last_name = last_name_str.getText().toString().trim();
String middle_name = middle_name_str.getText().toString().trim();
String phone = phone_str.getText().toString().trim();
String password = password_str.getText().toString().trim();
if (email.isEmpty()) {
email_str.setError("Введите Email");
email_str.requestFocus();
return;
}
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches()) {
email_str.setError("Введите корректный Email");
email_str.requestFocus();
return;
}
if (first_name.isEmpty()) {
first_name_str.setError("Введите Имя");
first_name_str.requestFocus();
return;
}
if (last_name.isEmpty()) {
last_name_str.setError("Введите Фамилию");
last_name_str.requestFocus();
return;
}
if (middle_name.isEmpty()) {
middle_name_str.setError("Введите Отчество");
middle_name_str.requestFocus();
return;
}
if (phone.isEmpty()) {
phone_str.setError("Введите Телефон");
phone_str.requestFocus();
return;
}
if (password.isEmpty()) {
password_str.setError("Введите Пароль");
password_str.requestFocus();
return;
}
if (password.length() < 6) {
password_str.setError("Пароль должен содержать более 6 символов");
password_str.requestFocus();
return;
}
mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
String email_s = email_str.getText().toString().trim();
String first_name_s = first_name_str.getText().toString();
String last_name_s = last_name_str.getText().toString().trim();
String middle_name_s = middle_name_str.getText().toString().trim();
String phone_s = phone_str.getText().toString().trim();
String password_s = password_str.getText().toString().trim();
String userid = user.getUid();
User users = new User(userid, email_s, first_name_s, last_name_s, middle_name_s, phone_s, password_s);
mRef.child(userid).setValue(users);
Intent intent = new Intent(signup.this, MainActivity.class);
startActivity(intent);
Toast.makeText(getApplicationContext(), "Регистрация прошла успешно, теперь можете пройти авторизацию", Toast.LENGTH_SHORT).show();
} else {
if(task.getException() instanceof FirebaseAuthUserCollisionException){
Toast.makeText(getApplicationContext(), "Данный Email уже зарегистрирован", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(), task.getException().getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_register:
registerUser();
break;
case R.id.button_back:
startActivity(new Intent(this, MainActivity.class));
break;
}
}
}
Класс User
package com.example.finaljournalstudent;
public class User {
public String uid,email_c,first_name_c,last_name_c, middle_name_c, phone_c, password_c;
public User(){}
public User(String uid, String email_c, String first_name_c, String last_name_c, String middle_name_c, String phone_c, String password_c) {
this.uid = uid;
this.email_c = email_c;
this.first_name_c = first_name_c;
this.last_name_c = last_name_c;
this.middle_name_c = middle_name_c;
this.phone_c = phone_c;
this.password_c = password_c;
}
public String getUid() {
return uid;
}
public void setUid(String uid) {
this.uid = uid;
}
public String getEmail_c() {
return email_c;
}
public void setEmail_c(String email_c) {
this.email_c = email_c;
}
public String getFirst_name_c() {
return first_name_c;
}
public void setFirst_name_c(String first_name_c) {
this.first_name_c = first_name_c;
}
public String getLast_name_c() {
return last_name_c;
}
public void setLast_name_c(String last_name_c) {
this.last_name_c = last_name_c;
}
public String getMiddle_name_c() {
return middle_name_c;
}
public void setMiddle_name_c(String middle_name_c) {
this.middle_name_c = middle_name_c;
}
public String getPhone_c() {
return phone_c;
}
public void setPhone_c(String phone_c) {
this.phone_c = phone_c;
}
public String getPassword_c() {
return password_c;
}
public void setPassword_c(String password_c) {
this.password_c = password_c;
}
}
Класс страницы профиля
package com.example.finaljournalstudent;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class studentpage extends AppCompatActivity implements View.OnClickListener {
TextView first_name_profile, last_name_profile;
FirebaseAuth mAuth;
DatabaseReference mRef;
FirebaseDatabase mDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_studentpage);
first_name_profile = findViewById(R.id.profile);
last_name_profile = findViewById(R.id.profile2);
mAuth = FirebaseAuth.getInstance();
mDatabase = FirebaseDatabase.getInstance();
FirebaseUser currentUser = mAuth.getCurrentUser();
mRef = FirebaseDatabase.getInstance().getReference("Users");
// Read from the database
mRef.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.child("first_name_c").getValue(String.class); if(value == null) Log.e("AAAAAAAAAAAA", "value is null");
else { Log.e("AAAAAAAAAAAA", value); first_name_profile.setText(value); }
}
@Override
public void onCancelled(DatabaseError error) {
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_logout:
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(this, MainActivity.class));
Toast.makeText(getApplicationContext(), "Вы успешно вышли из аккаунта", Toast.LENGTH_SHORT).show();
break;
}
}
}
Именно на странице профиля и возникает проблема с выводом информации пользователя. Нужно чтобы для каждого авторизованного пользователя выводилась его информация. Где тут ошибка я не могу увидеть, так как в похожих работах я видел примерно эту же картину. В документации firebase не получилось нормально разобраться, там описано для других ситуаций.
Ответы (1 шт):
Итак изначальный код в вопросе выглядел так:
mRef = FirebaseDatabase.getInstance().getReference("Users").child("first_name_c");
// Read from the database
mRef.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String value = dataSnapshot.getValue(String.class);
first_name_profile.setText(value); }
}
@Override
public void onCancelled(DatabaseError error) {
}
});
Какие были ошибки:
- Строку
mRef = FirebaseDatabase.getInstance().getReference("Users").child("first_name_c");нужно было заменить наmRef = FirebaseDatabase.getInstance().getReference("Users");. Нельзя получить имя, если еще не получен конкретный пользователь. - В
dataSnapshotприходит не имя пользователя, а сам объект пользователя, а значит - имя еще надо получить. ЗаменяемString value = dataSnapshot.getValue(String.class);наString value = dataSnapshot.child("first_name_c").getValue(String.class); - Для удобства отладки имеет смысл сделать проверку хотя бы на
null.
Применив все 3 рекомендации получим итоговый код:
mRef = FirebaseDatabase.getInstance().getReference("Users");
// Read from the database
mRef.child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String userName = dataSnapshot.child("first_name_c").getValue(String.class);
if(userName == null) Log.e("YOUR_LOG_TAG", "Error userName is null");
else {
Log.e("YOUR_LOG_TAG", userName);
first_name_profile.setText(userName);
}
}
@Override
public void onCancelled(DatabaseError error) {
}
});

