# #java #android #firebase #firebase-realtime-database
Вопрос:
У меня есть несколько таблиц на Firebase, из которых я обычно получаю данные, но есть одна таблица, из которой я не могу получить данные таким же образом, хотя снимок таблицы содержит
фрагмент всех значений, из которого я получаю данные
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_doctors, container, false);
mClinicId = mAuth.getUid();
mDoctorList = new ArrayList<>();
mFloatingActionButton = v.findViewById(R.id.add_doctor_fab);
mEmptyListTextView = v.findViewById(R.id.empty_list_tv);
checkIsListEmpty();
mDoctorsRecyclerView = v.findViewById(R.id.doctors_rv);
mDoctorsRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(),
RecyclerView.VERTICAL, false));
mAdapter = new DoctorAdapter(mDoctorList, getActivity());
mDoctorsRecyclerView.setAdapter(mAdapter);
DatabaseReference mReference = FirebaseDatabase.getInstance().getReference().child("employees");
mReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
Log.d("myLog", "onDataChange: snapshot " snapshot);
for (DataSnapshot doctorSnapshot : snapshot.getChildren()){
Doctor doctor = doctorSnapshot.getValue(Doctor.class);
mDoctorList.add(doctor);
Log.d("myLog", "onDataChange: doctor " doctor.getEmail());
}
mAdapter.setDoctors(mDoctorList);
mAdapter.notifyDataSetChanged();
checkIsListEmpty();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Log.d("myLog", "onCancelled: " error.getMessage());
}
});
mFloatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mClinicId != null) {
startActivity(RegistrationActivity.newInstance(getActivity(),
true, mClinicId));
}
}
});
return v;
}
Doctor.java
private String mUID;
private String mEmail;
private String mSurname;
private String mName;
private String mPatronymic;
private Date mBirthDate;
private String mClinicId;
private String mPosition;
public Doctor() {
}
public Doctor(String UID, String email, String surname, String name, String patronymic, Date birthDate, String clinicId, String position) {
mUID = UID;
mEmail = email;
mSurname = surname;
mName = name;
mPatronymic = patronymic;
mBirthDate = birthDate;
mClinicId = clinicId;
mPosition = position;
}
public String getPosition() {
return mPosition;
}
public String getUID() {
return mUID;
}
public String getEmail() {
return mEmail;
}
public String getSurname() {
return mSurname;
}
public String getName() {
return mName;
}
public String getPatronymic() {
return mPatronymic;
}
public Date getBirthDate() {
return mBirthDate;
}
public String getClinicId() {
return mClinicId;
}
}
Как вы можете видеть на снимке, данные есть, но когда они инициализированы, они равны нулю
Бревна
2021-05-02 19:03:14.510 20833-20833/com.rpkeffect.android.rpkpolyclinik D/myLog: onDataChange: snapshot DataSnapshot { key = employees, value = {-MZhhQb9EaQkjOp8GLEm={uid=frrvDpFDCiVBPxHkoq328XT0XwV2, clinicId=7iNGGrbV4cXU1NnyVYy0rNIUE0w2, patronymic=dudhdh, surname=dhdjhdjdh, name=dudhd, position=dyduxh, birthDate={date=2, hours=0, seconds=0, month=4, timezoneOffset=-240, year=94, minutes=0, time=767822400000, day=1}, email=mail@mail.ru}, -MZhi2_TqCZvabIekppj={uid=IZsIIxdlw1f7E66xoNluzyc9IPT2, clinicId=frrvDpFDCiVBPxHkoq328XT0XwV2, patronymic=djdnx, surname=djdnxxn, name=xjxbx, position=jxjxnxx, birthDate={date=2, hours=0, seconds=0, month=4, timezoneOffset=-240, year=93, minutes=0, time=736286400000, day=0}, email=mail@mail.ru}} }
2021-05-02 19:03:14.512 20833-20833/com.rpkeffect.android.rpkpolyclinik D/myLog: onDataChange: doctor null
2021-05-02 19:03:14.512 20833-20833/com.rpkeffect.android.rpkpolyclinik D/myLog: onDataChange: doctor null
Если я попытаюсь получить данные из другой таблицы, я смогу успешно их получить
Таблица Firebase
Комментарии:
1. вы добавляете
mDoctorList.add(doctor);
элементы в свой список, где вы настраиваете этот список для своего адаптера ? единственное, что я вижу, что вы делаетеmAdapter.notifyDataSetChanged();
, но вы никогда не устанавливаете этот список массивов на свой адаптер ?2. Я установил адаптер выше, но проблема не в этом. Проблема в том, что я не могу получить
doctor
данные из моментального снимка, и они всегда равны нулю, как вы можете видеть в журналах.3. я не спрашиваю, где вы устанавливаете адаптер, я спрашиваю, где вы устанавливаете данные для адаптера ?
mAdapter.items = mDoctorList
?4. Хорошо, проверьте изменения в коде фрагмента. Но это не меняет того факта, что я не могу получить данные из снимка
Ответ №1:
Проблема заключалась в том, что я не создавал сеттеров в своем Doctor.java
классе
Doctor.java
public class Doctor {
private String mUID;
private String mEmail;
private String mSurname;
private String mName;
private String mPatronymic;
private Date mBirthDate;
private String mClinicId;
private String mPosition;
public Doctor() {
}
public Doctor(String UID, String email, String surname, String name, String patronymic, Date birthDate, String clinicId, String position) {
mUID = UID;
mEmail = email;
mSurname = surname;
mName = name;
mPatronymic = patronymic;
mBirthDate = birthDate;
mClinicId = clinicId;
mPosition = position;
}
public String getPosition() {
return mPosition;
}
public String getUID() {
return mUID;
}
public String getEmail() {
return mEmail;
}
public String getSurname() {
return mSurname;
}
public String getName() {
return mName;
}
public String getPatronymic() {
return mPatronymic;
}
public Date getBirthDate() {
return mBirthDate;
}
public String getClinicId() {
return mClinicId;
}
public void setUID(String UID) {
mUID = UID;
}
public void setEmail(String email) {
mEmail = email;
}
public void setSurname(String surname) {
mSurname = surname;
}
public void setName(String name) {
mName = name;
}
public void setPatronymic(String patronymic) {
mPatronymic = patronymic;
}
public void setBirthDate(Date birthDate) {
mBirthDate = birthDate;
}
public void setClinicId(String clinicId) {
mClinicId = clinicId;
}
public void setPosition(String position) {
mPosition = position;
}
Ответ №2:
Когда вы пытаетесь сопоставить узел из базы данных Firebase в реальном времени с объектом вашего «Доктора», имена полей, существующих в вашем классе, должны совпадать с именами ваших свойств, существующих в вашей базе данных. К сожалению, в вашем случае поля не совпадают. Видите ли, поля в вашем классе начинаются с «m», в то время как в базе данных не начинаются с «m», что неверно.
Чтобы решить эту проблему, у вас есть два варианта: вы либо меняете имя своих свойств в классе в соответствии с именем в базе данных, либо можете использовать аннотацию перед получателями. Например, если у вас есть поле «mEmail», а свойство в базе данных называется «электронная почта», ваш получатель должен выглядеть следующим образом:
@PropertyName("email")
public String getEmail() {
return mEmail;
}
Таким образом, вы указываете компилятору искать свойство под названием «электронная почта», а не «mEmail».