2017-04-25 8 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は正しい曜日名を返しますが、 "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キーを含む内部オブジェクトにアクセスする前に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 

それでは持っているものと同様のモデルを仮定します、あなたが望むデータに応じて、アクセスが容易になるだろう2つのクエリのパスを持っています。たとえば、すべてのメンバー、すべてのグループ、今週の曜日の出席者など

私の提案では、データベースに対して複数のルックアップを行う必要があります。一度すべてのメンバーを取得し、追加のメンバーと出席者とグループを取得し、特定のメンバーを除外します。

おそらく、メンバーにアクセスできるアダプタのgetViewメソッド内でこれを行うことになります。それはref('attendance').child(day)のようなものになるだろうし、その子供たちを確認する必要があり、startAt(memberId).endAt(memberId)、私は思うが、1つのメンバーキーを取得する。そしてそこに返されたデータがあれば、そのハッシュマップはget(memberId).get('date')でしょう。

メンバーにランダムに生成されたキーを使用しないようにする必要があるため、object::<id>という表記法があります。

+0

あなたは正しいので、日付はnullです。データベースをリモデリングすると、結果はどのようにアダプターに渡されますか? populateViewでは、モデルクラスを使用して出席者を取得するためです。 populateViewの内部で新しいクエリを作成することは可能ですか? – fullMoon

+0

とget()の呼び出し方法は – fullMoon

+0

です。私の答えにはさらに追加しましたが、populateViewメソッドで別のクエリを実行することは可能です。もちろん、ネストされたリスナーのコードではうまく見えません –

関連する問題