2017-04-25 85 views
0

我试图从firebase获取值。在这里,我无法获取“考勤”节点中的值。查询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"); 
     } 
    } 

我能够检索 “名” 和 “组”值,但不包括“考勤”内的日期散列图。 Utility.getTodayName给出正确的日期名称,但“日期”返回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

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

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

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

您可以简单地在当前使用get("date")的地图的keySet上使用for循环遍历所有密钥,使用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),我想,得到一个成员的关键。如果有任何数据返回,那么你会得到这个Hashmap get(memberId).get('date')

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

+0

你说得对,那就是为什么日期是空的。如果我重新编码数据库,我将如何将结果传递给适配器?因为在populateView中我使用模型类来获得出席。是否有可能在populateView内创建一个新的查询? – fullMoon

+0

以及如何得到()将被称为 – fullMoon

+0

我已经添加了更多的答案,但是,是的,应该有可能在populateView方法中做另一个查询。当然,它在嵌套监听器的代码中看起来不太好 –