Маршалловые данные из DataSnapshot в пользовательский класс в Android Studio

Кажется, я не могу понять, как читать данные из снимка данных в мой собственный класс.

Вот функция, в которой я пытаюсь это сделать:

    private void initializeFirebase(){
    my_db = FirebaseDatabase.getInstance();
    DatabaseReference my_ref = my_db.getReference();
    Map<String, ?> values = sharedPreferences.getAll();

    if (!values.isEmpty()){
        final String id = Profile.getCurrentProfile().getId();
        my_ref = my_ref.child("users").child("userid").child(id);
        if (my_ref != null) my_ref.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                value = dataSnapshot.getValue(UserData.class);
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
        mergeClassToSharedPreferences();
    }
    else {
        for (Map.Entry<String, ?> entry : values.entrySet()) {
            my_ref.child("userid").child(Profile.getCurrentProfile().
                    getId()).child(entry.getKey()).setValue(entry);
        }
    }
}

А вот и класс, который я написал:

 public class UserData {

    public String age, customized_message, dreams_response, gender, intro_response,
            rpp_phone_number, substances_response;
    public boolean relapse_prevention_program, firstrun;
    public int distance;

    public UserData(){

    }

    public UserData(String age, String customized_message, String dreams_response, String gender,
                    String intro_response, String rpp_phone_number, String substances_response,
                    boolean relapse_prevention_program, boolean firstrun, int distance){

        this.age = age;
        this.customized_message = customized_message;
        this.dreams_response = dreams_response;
        this.gender = gender;
        this.intro_response = intro_response;
        this.rpp_phone_number = rpp_phone_number;
        this.substances_response = substances_response;
        this.relapse_prevention_program = relapse_prevention_program;
        this.firstrun = firstrun;
        this.distance = distance;
    }

    public String getAge(){
        return age;
    }
    public String getCustomized_message(){
        return customized_message;
    }
    public String getDreams_response(){
        return dreams_response;
    }
    public String getGender(){
        return gender;
    }
    public String getIntro_response(){
        return intro_response;
    }
    public String getRpp_phone_number(){
        return rpp_phone_number;
    }
    public String getSubstances_response(){
        return substances_response;
    }
    public boolean getRelapse_prevention_program(){
        return relapse_prevention_program;
    }
    public boolean getFirstrun(){
        return firstrun;
    }
    public int getDistance(){
        return distance;
    }

    public void setDreams_response(String dreams_response){
        this.dreams_response = dreams_response;
    }
    public void setGender(String gender){
        this.gender = gender;
    }

    public void setIntro_response(String intro_response){
        this.intro_response = intro_response;
    }
    public void setRpp_phone_number(String rpp_phone_number){
        this.rpp_phone_number = rpp_phone_number;
    }
    public void setAge(String age){
        this.age = age;
    }
    public void setCustomized_message(String customized_message){
        this.customized_message = customized_message;
    }
    public void setSubstances_response(String substances_response){
        this.substances_response = substances_response;
    }
    public void setRelapse_prevention_program(boolean relapse_prevention_program){
        this.relapse_prevention_program = relapse_prevention_program;
    }
    public void setFirstrun(boolean firstrun){
        this.firstrun = firstrun;
    }
    public void setDistance(int distance){
        this.distance = distance;
    }
}

Я считаю, что получаю доступ к своему дереву правильно, но каждый раз, когда я пытаюсь запустить этот код, он просто сообщает, что «W / ClassMapper: Нет установщика / поля для ключа или значения, найденного в классе». введите описание изображения здесь

По какой линии? С какими исходными данными?

Doug Stevenson 06.07.2018 07:31

Он не указывает номер строки. Я опубликую картинку своего JSON-дерева с моими данными.

Braedan Shigley 10.07.2018 00:19

Ссылка на изображение находится в самом низу поста!

Braedan Shigley 10.07.2018 00:38
1
3
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Способ моделирования данных в базе данных реального времени несовместим с тем, как SDK выполняет автоматическую сериализацию. Он принимает только пары ключ / значение, где ключи сопоставляются с полями в вашем объекте, а значения соответствуют типу данных, которые может содержать каждое поле. Ваши данные структурированы с объектами для каждого поля. Если вы используете эту структуру, вам нужно будет написать собственный код, чтобы получить все эти данные из моментальных снимков в ваш POJO.

Большое спасибо! Если я использую setValue (экземпляр UserData), передавая экземпляр класса со всеми инициализированными переменными, будет ли он автоматически создавать структуру пары ключ-значение, чтобы я мог повторно загрузить данные позже в новый экземпляр класса?

Braedan Shigley 10.07.2018 00:58

Пока есть все простые типы значений.

Doug Stevenson 10.07.2018 01:19

Другие вопросы по теме