Как получить список внутри элемента в Firebase?

У меня есть следующая структура в Firebase:

"surveys" : {
"-Kq2r56mEoZ0LDBbi47W" : {
  "name" : "Survey 1",
  "questions" : [ {
    "name" : "Question 1"
  },{
    "name" : "Question 2"
  },{
    "name" : "Question 3"
  } ]     
}

Вот соответствующий класс Java Survey.java:

public class Survey {
    private String name;
    private ArrayList<String> questions = new ArrayList<>();

    public Survey(){}
   // Getters and setters
   ...
}

В своей деятельности я пытаюсь получить элемент опроса следующим образом:

final DatabaseReference surveysReference = database.getReference(FirebaseReferences.SURVEY_REFERENCE).child(currentId);
surveysReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        SurveyDao survey = snapshot.getValue(SurveyDao.class);
        surveyList.add(survey);
    }

    @Override
    public void onCancelled(DatabaseError firebaseError) {
        System.out.println("The read failed: " + firebaseError.getMessage());

    }
});

Но я продолжаю получать ошибки, потому что структура не верна. Как я могу получить свой список "вопросов" и сохранить его в моем объекте Survey?

заранее спасибо

3 ответа

Решение

Вопросы в вашем опросе должны быть:

List<Map<String, String>>

вместо:

List<String>

Вы также можете создать класс Question:

@IgnoreExtraProperties
public class Question {

    public String name;

    public Question() {
        // Default constructor required for calls to DataSnapshot.getValue(Question.class)
    }

    public Question(String name) {
        this.name = name;
    }

}

и это будет:

List<Question>

Проверьте документацию Firebase.

В вашем опросе опроса содержат другой объект ieKq2r56mEoZ0LDBbi47W, который через ваш класс Survey, как

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Surveys {

@SerializedName("-Kq2r56mEoZ0LDBbi47W")
@Expose
private Kq2r56mEoZ0LDBbi47W kq2r56mEoZ0LDBbi47W;

public Kq2r56mEoZ0LDBbi47W getKq2r56mEoZ0LDBbi47W() {
return kq2r56mEoZ0LDBbi47W;
}

public void setKq2r56mEoZ0LDBbi47W(Kq2r56mEoZ0LDBbi47W kq2r56mEoZ0LDBbi47W) {
this.kq2r56mEoZ0LDBbi47W = kq2r56mEoZ0LDBbi47W;
}

}

и класс Kq2r56mEoZ0LDBbi47W содержит список вопросов

import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Kq2r56mEoZ0LDBbi47W {

@SerializedName("name")
@Expose
private String name;
@SerializedName("questions")
@Expose
private List<Question> questions = null;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Question> getQuestions() {
return questions;
}

public void setQuestions(List<Question> questions) {
this.questions = questions;
}

}

и класс вопроса:

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Question {

@SerializedName("name")
@Expose
private String name;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}

Если ваш класс Survey такой:

public class Survey {
   private String name;
   private ArrayList<String> questions = new ArrayList<>();

   public Survey(){}
   // Getters and setters
   ...
}

Тогда ваша структура firebase должна быть такой:

"surveys" : {
   "-Kq2r56mEoZ0LDBbi47W" : {
        "name" : "Survey 1",
        "questions" : [ 
             {
              0 : "Question 1"
             },{
              1 : "Question 2"
             },{
              2 : "Question 3"
             } 
        ]     
}

Помните, что arrayList или list похожи на Map, но используют integer в качестве индекса. И это начинается с 0

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