查询Firebase,检索并传递给适配器

时间:2017-04-25 23:24:39

标签: android firebase firebase-realtime-database

我试图从firebase获取值。在这里,我无法获得"出勤率"节点

enter image description here

这是我的模特:

public class MemberInGroup {

private String name;
private HashMap<String, HashMap<String, Object>> attendance;
private String group;

public MemberInGroup() {

}

public MemberInGroup(String name, HashMap<String, HashMap<String, Object>> attendance, String group) {
    this.name = name;
    this.attendance = attendance;
    this.group = group;
}

public String getName() {
    return name;
}

public String getGroup() {
    return group;
}

public HashMap<String, HashMap<String, Object>> getAttendance() {
    return attendance;
}

以下是适配器中的populateView方法:

    @Override
protected void populateView(View view, MemberInGroup member, int i) {

    final String name = member.getName();
    final String group = member.getGroup();

    // Create views and assign values
    final TextView nameTxtView = (TextView) view.findViewById(R.id.nameTxtView);
    nameTxtView.setText(name);

    HashMap<String, HashMap<String, Object>> attendance = member.getAttendance();

    if(attendance != null) {
        HashMap<String, Object>  todayAttendance = attendance.get(Utility.getTodayName());
        if(todayAttendance != null) {

            String date = (String) todayAttendance.get("date");
        } 
    }

我能够检索&#34;名称&#34;和&#34;组&#34;值,但不是&#34;出勤&#34;内的日哈希映射。 Utility.getTodayName给出正确的日期名称,但是&#34; date&#34;返回null。

以下是我查询数据库和设置适配器的方法:

                    final DatabaseReference ref = database.getReference();

                Query query = ref.child("members")
                        .orderByChild("group")
                        .equalTo("group7");

                // Set the adapter with groupMembersRef
                MembersOfGroupAdapter mOfGroupAdapter = new MembersOfGroupAdapter(getActivity(), MemberInGroup.class,
                        R.layout.list_item_member_in_sport, query);
                sportMembersListView.setAdapter(mOfGroupAdapter);

我试图查询特定群组中的所有成员。任何建议都表示赞赏。

1 个答案:

答案 0 :(得分:1)

  

Utility.getTodayName给出正确的日期名称,但“date”返回null。

您在日期名称和日期值之间有一个中间键。你需要经历这一点。换句话说,这是在访问包含get()键的内部对象之前必须date的字符串值。

顺便说一句,如果您希望按顺序迭代任何值,则应该使用TreeMap,而不是Hashmap

您可以在该地图的keySet上使用for循环,当前使用get("date")循环遍历所有密钥,使用get(key).get("date")

关于NoSQL的事情是,有多种方法可以做你想要的,但也许你应该考虑重新构建数据,以便在同一级别的成员中添加一个出勤节点。没有理由将所有内容放在成员键下,有时需要复制信息才能在SQL中实现某种类型的JOIN。

我会假设一个类似于你拥有的模型

attendance 
    monday
        member::1
    tuesday
        member::1
        member::2
members 
    member::1
        name 
        email
    member::2
groups
    group::7
        members
            member::4

那么,根据您想要的数据,您有两个更容易访问的查询路径。例如,所有成员,所有组,一周中某一天的与会者等。

根据我的建议,你必须对数据库进行多次查找。一旦获得所有成员,然后获得其他成员以获得出席和团体,然后筛选出给定成员。

您可能在适配器getView方法中执行此操作,您可以在其中访问成员。它应该是ref('attendance').child(day)之类的东西,然后你需要检查那些孩子,我认为startAt(memberId).endAt(memberId)得到一个成员密钥。如果那里返回了任何数据,那么你应该使用get(memberId).get('date')的Hashmap。

要求是您不要为成员使用随机生成的密钥,因此需要object::<id>表示法。