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

时间:2018-04-20 03:49:44

标签: 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

这是我的数据类。这是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;
    }
}

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;
   }
}

这是我的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) {

    }
});

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

enter image description here

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

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

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

感谢您处理此问题的帮助。谢谢你的关怀。

2 个答案:

答案 0 :(得分:2)

您的POJO类Chapter中存在多个错误。首先,错误消息清楚地表明缺少chapterOnechapterTwo属性。你需要在你的POJO中。

所以你的Chapter.java应该是这样的。

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

还需要定义ChapterOneChapterTwo类。

public class ChapterOne extends ChapterDetails {

}

public class ChapterTwo extends ChapterDetails {

}

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

请注意,您的chapterName pojo中的chapterExplainChapter拼写错误。当前变量名称为chaterNamechaterExplain,这是错误的。请修复变量名称。

更新

  

但是我可以在主题的章节数据中获取数据来改变变量类型   类? List .. Map ..或.. somethnig就是这样。不要上新课   ChapterOne .. ChapterTwo ..

使用您当前的实现,这是不可能的。但是,我建议您的firebase数据库实现稍作更改。让我们以chapter节点进行修改。

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

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

public class Chapter {
    List<ChapterDetails> chapterDetails;
}

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

对不起,我问了太多。但同一章节详细信息未加入   Firebases。我试图用chapterId 1和a添加chapterDetail   chapterDetail with chapterId 2,但它消失或被替换。

我刚刚展示了一个伪实现。对不起,如果更新的答案有误导性。但是,请使用以下内容在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); 

现在从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());
      }
  });

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

答案 1 :(得分:1)

要从数据库中读取数据,您需要一个DatabaseReference实例:

private DatabaseReference mDatabase;

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

然后您可以添加具有setValue()的用户,如下所示:

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

请参阅此处的示例,从数据库中检索帖子的详细信息:

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