Не удается получить данные из базы данных Firebase в реальном времени Android

# #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

https://i.stack.imgur.com/qkjvB.png

Комментарии:

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».