2017-01-14 65 views
3

我試圖在我的應用中實現Firebase數據庫,但我在同時從多個節點檢索數據並更新UI時遇到問題。 我將所有Firebase方法存儲在單獨的類中。 這裏是一個從節點檢索一個數據的方法的例子。從Firebase數據庫並行檢索數據並與Android中的UI同步

public static void getTrainerCity(final Trainer trainer) { 
    dbref.child(USER_CITY).child(trainer.getId()).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      trainer.setCity(dataSnapshot.getValue(String.class)); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

然後,爲了獲取例如一個完整的教練,我做

public static void getTrainer(final boolean isAthlete, final String trainerId, Trainer trainer) { 
    trainer.setId(trainerId); 
    getTrainerCity(trainer); 
    getTrainerName(trainer); 
    getTrainerAge(trainer); 
    getTrainerNumber(trainer); 
    getTrainerEmail(trainer); 
    getTrainerGym(trainer); 
    getTrainerPhoto(trainer); 
    getTrainerStudyDegree(trainer); 
    getTrainerDescription(trainer); 
    if(!isAthlete) { 
     getTrainerAthletes(trainer); 
    } 
} 

當我打電話的UI這個方法,我沒有得到整個訓練目的是在一個鏡頭,因爲這些方法唐不會在主線上運行。這意味着培訓師不斷更新。但是,我只想在與該方法相關的對象的所有字段都已設置時(我必須填充列表並初始化用戶)才通知UI。你會如何做到這一點?

我想過安裝監聽器,但似乎我需要他們的巨大數額。謝謝你們

編輯:這是DB是如何構成的 This is how db is structured

回答

2

它的場景這樣的地方RxJava照.....你可以做的是包裹火力查詢在Observable.create(),然後使用類似RxJava zip運算符合並所有查詢。 (要避免的,如果可能的話)的另一種方法是窩都導致可怕的callback hell

例如,你可能會有諸如以下爲getTrainerCity

public static Observable<String> getTrainerCity(int trainerId) { 
    return Observable.create(subscriber -> { 
     dbref.child(USER_CITY).child(trainerId).addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       String city = dataSnapshot.getValue(String.class); 
       subscriber.onNext(city); 
       subscriber.onCompleted(); 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 
      } 
     });  
    }); 
} 
1

你應該先把教練節點,然後解析查詢獲取的數據。 我假設你有一個包含所有信息培訓師節點(市,姓名,年齡,...)

public static void getTrainer(final Trainer trainer) { 
    dbref.child(trainer_node).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Trainer trainer = dataSnapshot.getValue(Trainer.class); 
      String name = trainer.getName(); 
      String city = trainer.getCity(); 
      int age = trainer.getAge(); 
    . 
    . 
    . 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 
} 

編輯: 數據結構可以這樣

-users_node 
--user1 
---id:userid 
---name: username 
---city:usercity 
---email:useremail 
---workouts 
----workoutid1:true 
----workoutid2:true 

--user2 
---id:.. 

-athletes_node 
--user1:true 
--user2:true 
--userX:true 

-workouts_node 
--workoutid1 
---workout details here 
--workoutid2 
---workout details here 
+0

更好的數據存儲和檢索,如https://firebase.google.com/docs/database/web/structure-data所述,我有不同的節點,如:user_city,user_name,user_email,ecc,運動員和教練都在這裏拉。 – Synchronyze

+0

不知道烏爾DB結構沒有人可以幫助 – uguboz

+0

只是增加了一個PIC – Synchronyze

相關問題