【问题标题】:How to access data from firebase Realtime database child?如何从firebase实时数据库子访问数据?
【发布时间】:2021-06-14 14:14:01
【问题描述】:

Realtime Database Data

我的实时数据库 json

 "module1" : {
"Operating System" : {
  "pdfName" : "pdf",
  "pdfUrl" : "gs://knec-pastpapers.appspot.com/module1/OS/july2007.pdf"
}

}

我在访问 操作系统 下的字段并在 Recycler 视图中显示数据时遇到问题。 这是我的模型课

public class viewModel {
public String pdfName;
public String pdfUrl;


public viewModel() {

}

public viewModel(String pdfName, String pdfUrl) {
    this.pdfName = pdfName;
    this.pdfUrl=pdfUrl;
}


public String getPdfName() {
    return pdfName;
}

public void setPdfName(String pdfName) {
    this.pdfName = pdfName;
}

public String getPdfUrl() {
    return pdfUrl;
}

public void setPdfUrl(String pdfUrl) {
    this.pdfUrl = pdfUrl;
}

这就是我尝试从实时数据库访问字段的方式

databaseReference= FirebaseDatabase.getInstance().getReference("ict").child("Operating System");
    getImageData();
}

private void getImageData() {
    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot di:dataSnapshot.getChildren()){
                viewModel articleList=di.getValue(viewModel.class);
                articleLists.add(articleList);
            }
            loadpdfsAdapter adapter=new loadpdfsAdapter(articleLists,getApplicationContext());
            rv.setAdapter(adapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
} 

运行代码后,我的 recyclerview 为空。 我的问题是如何访问操作系统下的子节点?

【问题讨论】:

  • 您希望在 RecyclerView 中显示什么?在您的“操作系统”内部,只有两个字符串值。
  • “操作系统”中的两个字符串
  • 所以你需要pdfgs://knec-pastpapers.appspot.com/module1/OS/july2007.pdf。在 RecyclerView 中显示单个对象的值是没有意义的。此视图旨在容纳多个对象。
  • 但是当没有操作系统选项 "module1" : { "pdfName" : "pdf", "pdfUrl" : "gs://knec- pastpapers.appspot.com/module1/OS/july2007.pdf" } 并在 recyclerview 上正确显示
  • 我的问题是如何在操作系统下访问两个字段。请帮助我@AlexMamo

标签: java android firebase firebase-realtime-database


【解决方案1】:

for (DataSnapshot di:dataSnapshot.getChildren()){ 仅在您获得的快照具有多个 viewModel 子节点时才需要。但由于您是从 /ict/Operating System 加载数据,因此只有一个 viewModel 子节点。

您要么必须删除循环:

databaseReference= FirebaseDatabase.getInstance().getReference("ict").child("Operating System");

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        viewModel articleList=dataSnapshot.getValue(viewModel.class);
        articleLists.add(articleList);
        ...

或者您可以加载所有ict,然后循环遍历子节点:

databaseReference= FirebaseDatabase.getInstance().getReference("ict");

databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot di:dataSnapshot.getChildren()){
            viewModel articleList=di.getValue(viewModel.class);
            articleLists.add(articleList);
        }
        ...

【讨论】:

    猜你喜欢
    • 2019-02-16
    • 1970-01-01
    • 2019-04-13
    • 2023-01-16
    • 2021-04-22
    • 1970-01-01
    • 2020-08-13
    • 2021-04-13
    • 2021-02-10
    相关资源
    最近更新 更多