Как получить список внутри элемента в 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