4 votes

A propos de la récupération de données par Android Firebase (Pas d'erreur de setter/field)

Je veux juste récupérer les données de mon firebase mais je ne connais pas la bonne façon d'obtenir ces données. Voici mon erreur dans Android studio :

  W/ClassMapper: No setter/field for chapterTwo found on class 
  com.junburg.moon.rockbottom.model.Chapter
  W/ClassMapper: No setter/field for chatperOne found on class 
  com.junburg.moon.rockbottom.model.Chapter
  W/ClassMapper: No setter/field for chapterTwo found on class 
  com.junburg.moon.rockbottom.model.Chapter
  W/ClassMapper: No setter/field for chapterOne found on class 
  com.junburg.moon.rockbottom.model.Chapter

Et voici mes classes de données. Il s'agit d'une Chapter.class modèle.

public class Chapter {

    private String chaterName;
    private String chaterExplain;

    public Chapter() {
    }

    public Chapter(String chaterName, String chaterExplain) {
        this.chaterName = chaterName;
        this.chaterExplain = chaterExplain;
    }

    public String getChaterName() {
        return chaterName;
    }

    public void setChaterName(String chaterName) {
        this.chaterName = chaterName;
    }

    public String getChaterExplain() {
        return chaterExplain;
    }

    public void setChaterExplain(String chaterExplain) {
        this.chaterExplain = chaterExplain;
    }
}

Et le Study.class modèle

public class Subject {
  private String subjectName;
  private String subjectExplain;
  private Chapter chapter;

  public Subject() {
  }

  public Subject(String subjectName, String subjectExplain, Chapter 
   chapter) {
    this.subjectName = subjectName;
    this.subjectExplain = subjectExplain;
    this.chapter = chapter;
  }

   public String getSubjectName() {
      return subjectName;
   }

   public void setSubjectName(String subjectName) {
        this.subjectName = subjectName;
   }

   public String getSubjectExplain() {
       return subjectExplain;
   }

    public void setSubjectExplain(String subjectExplain) {
       this.subjectExplain = subjectExplain;
   }

    public Chapter getChapter() {
       return chapter;
   }

   public void setChapter(Chapter chapter) {
        this.chapter = chapter;
   }
}

Et voici mon addValueEventListener code :

 private void getStudyData() {
      databaseReference.child("study")
     .child("subject")
     .addValueEventListener(new ValueEventListener() {

      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        subjectList.clear();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            Subject subject = ds.getValue(Subject.class);
            subjectList.add(subject);
            Log.d(TAG, "onDataChange: " + 
      subject.getChapter().getChaterName()  + 
      subject.getChapter().getChaterExplain());

        }
        studyRecyclerAdapter.notifyDataSetChanged();

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Enfin, voici mon arbre JSON dans la base de données Firebase.

enter image description here

J'ai essayé plusieurs méthodes, mais je n'ai pas pu résoudre cette erreur.

L'exécution du code ne renvoie pas les données de la classe Chapitre. Par exemple, l'exécution du code ne renvoie pas les données de la classe Chapitre :

subject.getChapter().getChaterName() 
subject.getChapter().getChaterExplain()

J'apprécierais que vous m'aidiez à résoudre ce problème. Et je vous remercie de votre attention.

2voto

Loser Points 354

Il y a plusieurs erreurs dans votre classe POJO de Chapter . Tout d'abord, le message d'erreur indique clairement que la chapterOne y chapterTwo sont absents. Vous en avez besoin dans votre POJO.

Ainsi, votre Chapter.java devrait ressembler à ceci.

public class Chapter {
    public ChapterOne chapterOne;
    public ChapterTwo chapterTwo;
}

Et le ChapterOne y ChapterTwo doivent également être définies.

public class ChapterOne extends ChapterDetails {

}

public class ChapterTwo extends ChapterDetails {

}

public class ChapterDetails {
    public String chapterName;
    public String chapterExplain;
}

Notez que vous avez mal orthographié le chapterName y el chapterExplain dans votre Chapter pojo que vous avez. Les noms de variables actuels sont chaterName y chaterExplain ce qui est faux. Veuillez également corriger les noms des variables.

Mise à jour

Mais je ne peux pas obtenir de données pour changer le type de variable dans les données de chapitre du sujet. classe ? Liste Map ou quelque chose d'autre comme ça. Il ne faut pas créer une nouvelle classe Chapitre un ChapitreDeux

Avec votre mise en œuvre actuelle, ce n'est pas possible. Cependant, je suggérerais un léger changement dans l'implémentation de votre base de données firebase. Prenons l'exemple de la base de données chapter pour la modification.

chapter
    - chapterDetails
        - chapterId : 1
        - chapterName : Something one
        - chapterExplain : Some explanation
    - chapterDetails
        - chapterId : 2
        - chapterName : Something two
        - chapterExplain : Some explanation

Si vous modifiez la structure de votre base de données firebase comme indiqué ci-dessus, vous obtiendrez la classe POJO suivante.

public class Chapter {
    List<ChapterDetails> chapterDetails;
}

public class ChapterDetails {
    public Long chapterId;
    public String chapterName;
    public String chapterExplain;
}

Je suis désolée d'avoir trop demandé. Mais le même chapterDetail n'est pas ajouté aux Firebases. aux Firebases. J'ai essayé d'ajouter un chapterDetail avec chapterId 1 et un chapterDetail avec chapterId 2, mais il disparaît ou est remplacé. chapterDetail avec chapterId 2, mais il disparaît ou est remplacé.

Je viens de montrer une pseudo-mise en œuvre. Je suis désolé si la réponse mise à jour était trompeuse. Cependant, veuillez définir vos données dans la base de données firebase en utilisant ce qui suit. Ainsi, vous pourrez récupérer vos données sous forme de liste à partir de firebase.

Firebase ref = new Firebase("<my-firebase-app>/chapter"):
List<Chapter> chapterList = new ArrayList<Chapter>();
// Now populate your chapterList with the chapters 
addItemsInYourChapterList();
ref.setValue(chapterList); 

Maintenant, en récupérant les données de la base de données firebase comme suit.

ref.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot snapshot) {
          System.out.println("There are " + snapshot.getChildrenCount() + " chapters");
          for (DataSnapshot chapterSnapshot: snapshot.getChildren()) {
            Chapter chapter = chapterSnapshot.getValue(Chapter.class);
            // Get your chapter details here.
          }
      }
      @Override
      public void onCancelled(FirebaseError firebaseError) {
          System.out.println("The read failed: " + firebaseError.getMessage());
      }
  });

Veuillez noter que je prends la chapter en considération uniquement. Modifiez le code en fonction de vos besoins.

1voto

Pour lire les données de la base de données, vous avez besoin d'une instance de DatabaseReference :

private DatabaseReference mDatabase;

mDatabase = FirebaseDatabase.getInstance().getReference();

Vous pouvez ensuite ajouter un utilisateur avec setValue() comme suit :

mDatabase.child("users").child(userId).setValue(user);

Voir ici l'exemple de la récupération des détails d'un message dans la base de données :

ValueEventListener postListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    // Get Post object and use the values to update the UI
    Post post = dataSnapshot.getValue(Post.class);
    // ...
}

@Override
public void onCancelled(DatabaseError databaseError) {
    // Getting Post failed, log a message
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
    // ...
}
};
mPostReference.addValueEventListener(postListener);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X