Android Java Firebase将对象查询到ArrayList中

时间:2018-04-16 19:01:55

标签: java android firebase firebase-realtime-database

所以我一直在尝试将Firebase中的数据下载到ArrayList:

SELECT COUNT(*), 
       SUM(CASE WHEN col1 = col3  THEN 1 ELSE 0 END) AS count_rows_same_1_3, 
       SUM(CASE WHEN col2 = col6  THEN 1 ELSE 0 END) AS count_rows_same_2_6
FROM YourTable T

调试器显示已创建Object SpottedAnimal宠物,然后将其插入到作为全局ArrayList的animalList中。但是,一旦我称之为方法:

 public void updateOnce(){
    animalList = new ArrayList<>();
    Query query = mDatabase.orderByChild("id");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                    SpottedAnimal pet = messageSnapshot.getValue(SpottedAnimal.class);
                    animalList.add(pet);
                }
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

另一方面,animalList空了。

public ArrayList<SpottedAnimal> getList(){
    return animalList;
}

1 个答案:

答案 0 :(得分:1)

onDataChange()是异步调用 因此,您必须使用列表作为添加动物对象的事件被触发 客户端类应该实现Observer接口或类似的东西,并且当您实例化FirebaseGetList时,您应该传递this(客户端对象):

在客户端类中:

public interface Notifiable {
   void update();
}

public class ClientClass implements Notifiable {

    public void foo(){
      FirebaseGetList animalListHook = new FirebaseGetList(); 
      animalListHook.updateOnce(this);
      ArrayList<SpottedAnimal> animalList = animalListHook.getList();
   }

  @Override
  public void update(){
      // use the animalList here
  }
}
FirebaseGetList中的

 @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) {
                SpottedAnimal pet = messageSnapshot.getValue(SpottedAnimal.class);
                animalList.add(pet);                    
            }
            this.update(); // method to notify 
        }
    }

请注意,使用全局变量可能是设计问题,应予以纠正 例如,update()方法可以将List of Animal作为参数传递。