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) {

    }
});

<a href=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
}
20
demandé sur Frank van Puffelen 2015-06-10 01:55:25

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);
35
répondu Felipe Rocha 2016-04-05 07:16:24

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());
       }
    });
 }
9
répondu Java coder 2017-06-22 14:27:05

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

2
répondu Tsirin Ilan 2017-07-17 15:02:52

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);
0
répondu Ruan 2017-03-24 10:24:40