2017-07-20 104 views
0

我有一個像文檔推薦(數據扇出)一樣設置的Firebase數據庫架構。我有一個節點與所有「運動員」和另一個節點與「隊」。我想根據「隊」節點內的運動員ID從「運動員」節點檢索運動員的信息。Android Firebase數據庫使用多個偵聽器檢索值

我的代碼如下所示:

if (eventListener == null) { 
     eventListener = new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       mAdapter.clear(); 
       athleteCount = 0; 
       final List<Athlete> athletes = new ArrayList<>(); 
       final long childrenCount = dataSnapshot.getChildrenCount(); 
       if (childrenCount == 0) { 
        hideProgressBar(); 
       } 
       for (DataSnapshot ds : dataSnapshot.getChildren()) { 
        String key = ds.getKey(); 
        athleteCount++; 
        if (!TextUtils.isEmpty(key)) { 
         mDatabaseReference.child(Athlete.ATHLETE).child(key) 
           .addListenerForSingleValueEvent(new ValueEventListener() { 
            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 
             Athlete athlete = dataSnapshot.getValue(Athlete.class); 
             if (athlete != null) { 
              athletes.add(athlete); 
              if (athleteCount == childrenCount) { 
               Collections.sort(athletes, new Athlete.AthleteComparator()); 
               mAdapter.setRoster(athletes); 
               hideProgressBar(); 
              } 
             } 
            } 
            @Override 
            public void onCancelled(DatabaseError databaseError) { 
            } 
           }); 
        } 
       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
     }; 
mDatabaseReference.child("teams") 
       .child("-KnyqjH0acSol5cxHLM1") 
       .child("athletes") 
       .addValueEventListener(mValueEventListener); 

現在這個代碼不正常工作,但我不認爲這是一個有點潔癖繼續增加監聽器,然後跟蹤該singleValueListeners後填充我的適配器已完成。必須有一個更簡單的方法來做到這一點。我在問,因爲我還需要從另一個節點檢索其他數據,這會非常混亂。

如果有人知道更好的方法,請讓我知道。謝謝。

這裏是我的架構的圖像: Firebase Database

回答

1

我能想到的幾種方法:

  1. 。提取得到運動員進入一個輔助方法,無論是與自己的回調的代碼,或通過傳遞適配器(或視圖)。
  2. 預載所有運動員,然後直接進行查找。
  3. 複製您在團隊節點下立即需要的每個運動員的數據。通常這只是他們的名字,所以你會有$athleteId: "Athlete's name"

可能有更多的選擇,但這些都是我的典型做法。

哦順便說一句,key永遠不會是空的,所以這個檢查(和縮進級別)是不需要的:if (!TextUtils.isEmpty(key)) {

+0

我會嘗試第一種方法。第二種方法聽起來也是一個好主意。由於我需要查看運動員,因此我必須在整個應用程序中保留運動員的記憶。我確實有重複的數據,但如果有人編輯了運動員的名字,找到同樣的運動員讓我們說7支球隊,然後在那裏編輯運動員的名字會很痛苦。謝謝。 – TrackDave

+0

如果您複製數據,則在寫入處理時會出現代碼複雜性和性能方面的問題。如果使用客戶端連接(正如您一直在嘗試的那樣),則在讀取處理中會出現代碼複雜性和性能方面的問題。如果讀取比寫入更頻繁,我會爲此進行優化。 –

相關問題