Comment récupérer un objet List à partir de la base de données firebase dans android
j'ai de la difficulté à extraire une liste de la base de données. Je n'ai aucun problème à le stocker, mais dès que j'essaierai de lancer dataSnapshot.getValue() ArrayList mon application se bloque, donnant une exception:
table de hachage ne peut pas être utilisé pour ArrayList
mais quand j'ai essayé de le lancer sur une HashMap, il s'écrase aussi, faisant exception:
ArrayList ne peut pas être utilisé pour hashmap
Besoin d'aide s'il vous plaît! Voici le code c'est la création du problème:
Fire.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List<TaskDes> td = (ArrayList<TaskDes>) dataSnapshot.getValue()
notifyDataSetChanged();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
firebase object screen shot" src="/images/content/30744224/9c09640a271c0adb4fffba436b45a561.jpg">
je veux récupérer toutes les données dans la base de données en une seule liste. La classe TaskDes contient trois champs:
class TaskDes { // definition
boolean done
String taskDescription
String taskTitle
}
4 réponses
vous devez créer un objet GenericTypeIndicator pour passer comme DataSnapshot.getValue()
paramètre.
Code:
GenericTypeIndicator<List<String>> t = new GenericTypeIndicator<List<String>>() {};
List<String> yourStringArray = dataSnapshot.getValue(t);
Votre Modèle
public class TaskDes {
private boolean done;
private String taskDescription;
private String taskTitle;
public TaskDes() {
}
public boolean isDone() {
return done;
}
public void setDone(boolean done) {
this.done = done;
}
public String getTaskDescription() {
return taskDescription;
}
public void setTaskDescription(String taskDescription) {
this.taskDescription = taskDescription;
}
public String getTaskTitle() {
return taskTitle;
}
public void setTaskTitle(String taskTitle) {
this.taskTitle = taskTitle;
}
}
vous devez créer un Indicateurgénéraltypeindicateur objet à transmettre en tant que DataSnapshot.getValue()
paramètre.
En Activité
private static final String TAG=MainActivity.class.getSimpleName();
private FirebaseDatabase database;
private DatabaseReference myRef=null;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
database=FirebaseDatabase.getInstance();
myRef=database.getReference("ADD_YOUR_REFERECE");
myRef.addValueEventListener(new ValueEventListener(){
@Override
public void onDataChange(DataSnapshot dataSnapshot){
/* This method is called once with the initial value and again whenever data at this location is updated.*/
long value=dataSnapshot.getChildrenCount();
Log.d(TAG,"no of children: "+value);
GenericTypeIndicator<List<TaskDes>> genericTypeIndicator =new GenericTypeIndicator<List<TaskDes>>(){};
List<TaskDes> taskDesList=dataSnapshot.getValue(genericTypeIndicator);
for(int i=0;i<taskDesList.size();i++){
Toast.makeText(MainActivity.this,"TaskTitle = "+taskDesList.get(i).getTaskTitle(),Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError error){
// Failed to read value
Log.w(TAG,"Failed to read value.",error.toException());
}
});
}
Faire un autre élément qui contient une liste pour votre article: C'est votre élément:
class TaskDes { // definition
boolean done
String taskDescription
String taskTitle
}
C'est l'élément de la liste
class TaskDesList { // definition
private ArreyList<TaskDes> yourlist
}
public TaskDesList(){
}
public ArrayList<TaskDes> getYourlist() {
return yourlist;
}
et lors de l'appel d'un EventListener
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
yourlist.clear();
taskDesList=dataSnapshot.getValue(TaskDesList.class);
if (taskDesList!=null) {
yourlist= taskDesList.getYourlist();
}
}
et maintenant "yourlist" est une liste qui contient tous vos "TaskDes" éléments
un peu en retard, mais au cas où quelqu'un d'autre aurait besoin de ça.
SI la liste est à l'intérieur d'un autre objet.
L'objet
public class Question {
public Date date;
public String questionNumber;
public String questionText;
public QuestionType questionType;
public String multipleSelection1;
public String multipleSelection2;
public String multipleSelection3;
public Question() {
// Default constructor required for calls to DataSnapshot.getValue(User.class)
}
}
puis obtenir votre tableau d'objets de question
GenericTypeIndicator<List<Question>> t = new GenericTypeIndicator<List<Question>>() {};
List<Question> questionList = dataSnapshot.getValue(t);