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後填充我的適配器已完成。必須有一個更簡單的方法來做到這一點。我在問,因爲我還需要從另一個節點檢索其他數據,這會非常混亂。
如果有人知道更好的方法,請讓我知道。謝謝。
我會嘗試第一種方法。第二種方法聽起來也是一個好主意。由於我需要查看運動員,因此我必須在整個應用程序中保留運動員的記憶。我確實有重複的數據,但如果有人編輯了運動員的名字,找到同樣的運動員讓我們說7支球隊,然後在那裏編輯運動員的名字會很痛苦。謝謝。 – TrackDave
如果您複製數據,則在寫入處理時會出現代碼複雜性和性能方面的問題。如果使用客戶端連接(正如您一直在嘗試的那樣),則在讀取處理中會出現代碼複雜性和性能方面的問題。如果讀取比寫入更頻繁,我會爲此進行優化。 –