2017-01-14 50 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

相关问题