2017-04-25 1 views
0

firebase에서 값을 가져 오려고합니다. 여기서는 "출석"노드 내부의 값을 가져올 수 없습니다. 내가 "이름"과 "그룹"을 검색 할 수있어Firebase 쿼리, 어댑터 가져 오기 및 어댑터 전달

@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"); 
     } 
    } 

: 여기

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의 어댑터에서 방법 : 여기

enter image description here

내 모델입니다 값,하지만 "출석"안에 하루 해시지도 않습니다. Utility.getTodayName은 정확한 요일 이름을 제공하지만 "date"는 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 키가 들어있는 내부 객체에 액세스하기 전에 해야하는 문자열 값입니다.

그런데 순서대로 값을 반복 할 예정이라면 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)을 체크 할 필요가 있습니다. 하나의 멤버 키를 얻기 위해서입니다. 거기에 반환 된 데이터가 있다면 그 해시 맵은 get(memberId).get('date')입니다.

구성원에 임의로 생성 된 키를 사용하지 않아야하므로 요구 사항은 object::<id>입니다.

+0

당신이 맞습니다. 날짜가 null 인 이유입니다. 데이터베이스를 리모델링하면 결과를 어댑터로 어떻게 전달합니까? 왜냐하면 populateView에서는 모델 클래스를 사용하여 출석을 얻습니다. populateView에서 새 쿼리를 만들 수 있습니까? – fullMoon

+0

그리고 get() 호출 방법은 – fullMoon

+0

입니다. 필자의 답에 더 많은 내용을 추가했으나, 네, populateView 메소드에서 다른 쿼리를 수행 할 수 있어야합니다. 물론 중첩 된 리스너와 코드에서 멋지게 보이지 않습니다. –