【问题标题】:Android - Retrieve data from different nodes in FirebaseAndroid - 从 Firebase 中的不同节点检索数据
【发布时间】:2016-08-13 21:07:55
【问题描述】:

我在 Firebase 中有两个节点,businessscience,它们都在一个名为 courses 的父节点下

{
  "courses" : {
    "business" : {
      "-KP-EadFq_rsXymxbUas" : {
        "courseCHours" : "4",
        "courseCode" : "BIZ2000",
        "courseName" : "Business Mathematics",
        "courseYear" : "1",
        "prerequisite" : {
          "-KP-EcGRXCtlXYQvjoYo" : {
            "preMainCourse" : "Business Mathematics",
            "preSubCourse" : "null"
          }
        },
        "sections" : {
          "-KP-EbIkS1jxVfNIE5jH" : {
            "sectionCode" : "A1",
            "sectionSeats" : "20"
          },
          "-KP-EbklnKpsUIIz_U68" : {
            "sectionCode" : "A2",
            "sectionSeats" : "20"
          }
        }
      }
    },
    "science" : {
      "-KP-EKJeu5PdfyJZnIVk" : {
        "courseCHours" : "4",
        "courseCode" : "SCI3000",
        "courseName" : "Science Fundamentals",
        "courseYear" : "1",
        "prerequisite" : {
          "-KP-EOVlKZx4zofkg5RT" : {
            "preMainCourse" : "Science Fundamentals",
            "preSubCourse" : "null"
          }
        },
        "sections" : {
          "-KP-EM8vYB9d0-axX8Cr" : {
            "sectionCode" : "A1",
            "sectionSeats" : "20"
          },
          "-KP-EModVxv_Vc3SBZ_G" : {
            "sectionCode" : "A2",
            "sectionSeats" : "20"
          }
        }
      },
      "-KP-EVvdvHgqxGPsxCrE" : {
        "courseCHours" : "4",
        "courseCode" : "SCI3100",
        "courseName" : "Science History",
        "courseYear" : "1",
        "prerequisite" : {
          "-KP-EXa8naK5uF7y9py2" : {
            "preMainCourse" : "Science History",
            "preSubCourse" : "null"
          }
        },
        "sections" : {
          "-KP-EWX0hh8q5d5YTkVR" : {
            "sectionCode" : "A1",
            "sectionSeats" : "20"
          },
          "-KP-EWu8pWXS1aR9zh_4" : {
            "sectionCode" : "A2",
            "sectionSeats" : "20"
          }
        }
      }
    }
  }
}

CourseDetails型号

public class CourseDetails {

    private String courseCode;
    private String courseName;
    private String courseCHours;
    private String courseYear;
    private String courseKey;

    public CourseDetails() {
    }

    public CourseDetails(String courseCode, String courseName, String courseCHours, String courseYear) {
        this.courseCode = courseCode;
        this.courseName = courseName;
        this.courseCHours = courseCHours;
        this.courseYear = courseYear;
    }

    @Exclude
    public String getCourseKey() {
        return courseKey;
    }

    public void setCourseKey(String courseKey) {
        this.courseKey = courseKey;
    }

    public String getCourseCode() {
        return courseCode;
    }

    public void setCourseCode(String courseCode) {
        this.courseCode = courseCode;
    }

    public String getCourseName() {
        return courseName;
    }

    public void setCourseName(String courseName) {
        this.courseName = courseName;
    }

    public String getCourseCHours() {
        return courseCHours;
    }

    public void setCourseCHours(String courseCHours) {
        this.courseCHours = courseCHours;
    }

    public String getCourseYear() {
        return courseYear;
    }

    public void setCourseYear(String courseYear) {
        this.courseYear = courseYear;
    }
}

我正在尝试从两个节点获取数据的代码

ArrayList<String> businessList;
ArrayList<String> scienceList;

DatabaseReference businessRef = FirebaseDatabase.getInstance().getReference().child("courses").child("business");

businessRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        displayBusiness(dataSnapshot);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

DatabaseReference scienceRef = FirebaseDatabase.getInstance().getReference().child("courses").child("science");

scienceRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        displayScience(dataSnapshot);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

public void displayBusiness(DataSnapshot dataSnapshot) {

    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        CourseDetails c = ds.getValue(CourseDetails.class);
        String code = c.getCourseCode();
        String name = c.getCourseName();
        String CodeName = code + " " + name;

        businessList.add(CodeName);
    }
}

public void displayScience(DataSnapshot dataSnapshot) {

    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        CourseDetails c = ds.getValue(CourseDetails.class);
        String code = c.getCourseCode();
        String name = c.getCourseName();
        String CodeName = code + " " + name;

        scienceList.add(CodeName);
    }
}

使用上面的代码似乎返回带有空数据的ArrayLists

我的目标是检索数据并存储在不同的ArrayListbusinessListscienceList 中。 ArrayLists 都将用于比较数据。

我的问题是检索到的数据不会保留在ArrayLists 中。如何确保检索到的数据存储在ArrayLists,以便我以后可以比较数据?

【问题讨论】:

    标签: android arraylist firebase firebase-realtime-database


    【解决方案1】:

    您没有将侦听器附加到正确的引用。

    改成这些

    businessRef.addListenerForSingleValueEvent(new ValueEventListener() {
    scienceRef.addListenerForSingleValueEvent(new ValueEventListener() {
    

    编辑

    在迭代内部,您不会从条目中调用 getValue。 改成这个

    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        CourseDetails c = ds.getValue(CourseDetails.class);
    

    您要确保仅当两个侦听器都调用了onDataChange时才调用比较方法,您可以use my solution in another similar questionuse a utility class from an answer from a firebaser here

    【讨论】:

    • 你好,威利克。真的很抱歉我忘了更新那部分。 Listeners 实际上都被正确引用了。我更新了我的代码
    • 啊好吧,你能把你的数据库结构和CourseDetails 类贴出来吗? @LorekBryanson
    • 好的。用结构编辑了我的问题
    • 对于sectionsprerequisite 节点,我使用另外两种不同的模型
    • @LorekBryanson 我明白了。因为这些监听器是异步工作的,所以你不能在它们完成之前进行比较(在调用onDataChange 之前)。您可以使用my solution in another similar question 或使用an answer from a firebaser here 中的实用程序类。希望这些有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多