关于Android Firebase检索数据(无setter/字段错误)

Jun*_*urg 5 java android firebase firebase-realtime-database

我只想从firebase数据库中检索数据,但我不知道获取该数据的正确方法。这是我在 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
Run Code Online (Sandbox Code Playgroud)

这是我的数据类。这是一个Chapter.class模型。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

还有Study.class型号

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

这是我的addValueEventListener代码:

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

    }
});
Run Code Online (Sandbox Code Playgroud)

最后,这是我在 Firebase 数据库中的 JSON 树。

在此输入图像描述

我尝试了一些方法,但无法解决这个错误。

代码执行不会返回 Chapter 类数据。例如:

subject.getChapter().getChaterName() 
subject.getChapter().getChaterExplain()
Run Code Online (Sandbox Code Playgroud)

我非常感谢您帮助处理这一问题。并感谢您的关心。

Rea*_*hed 2

您的 POJO 类中有几个错误Chapter。首先,错误消息清楚地表明缺少chapterOne和属性。chapterTwo您的 POJO 中需要它。

所以你的Chapter.java应该看起来像这样。

public class Chapter {
    public ChapterOne chapterOne;
    public ChapterTwo chapterTwo;
}
Run Code Online (Sandbox Code Playgroud)

并且还需要定义ChapterOne和类。ChapterTwo

public class ChapterOne extends ChapterDetails {

}

public class ChapterTwo extends ChapterDetails {

}

public class ChapterDetails {
    public String chapterName;
    public String chapterExplain;
}
Run Code Online (Sandbox Code Playgroud)

请注意,您的pojo中的chapterName和 the拼写错误。当前的变量名称是,哪个是错误的。请同时修复变量名称。chapterExplainChapterchaterNamechaterExplain

更新

但是我可以获取数据来更改主题类章节数据中的变量类型吗?列表.. 地图.. 或.. 其他类似的东西。不创建新类 ChapterOne.. ChapterTwo..

根据您当前的实现,这是不可能的。但是,我建议对您的 firebase 数据库实现稍作更改。让我们选取chapter要修改的节点。

chapter
    - chapterDetails
        - chapterId : 1
        - chapterName : Something one
        - chapterExplain : Some explanation
    - chapterDetails
        - chapterId : 2
        - chapterName : Something two
        - chapterExplain : Some explanation
Run Code Online (Sandbox Code Playgroud)

如果您像上面那样修改 Firebase 数据库结构,那么您可能会想到以下 POJO 类。

public class Chapter {
    List<ChapterDetails> chapterDetails;
}

public class ChapterDetails {
    public Long chapterId;
    public String chapterName;
    public String chapterExplain;
}
Run Code Online (Sandbox Code Playgroud)

抱歉我问得太多了。但相同的chapterDetail 未添加到Firebase 中。我尝试添加一个 ChapterId 1 的 ChapterDetail 和一个 ChapterId 2 的 ChapterDetail,但它消失或被替换。

我刚刚展示了一个伪实现。如果更新的答案有误导性,我们深表歉意。但是,请使用以下命令在 firebase 数据库中设置您的数据。这样您就可以从 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); 
Run Code Online (Sandbox Code Playgroud)

现在,从 firebase 数据库检索数据时,如下所示。

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());
      }
  });
Run Code Online (Sandbox Code Playgroud)

请注意,我chapter只考虑节点。根据您的需要修改代码。