所以我一直在尝试将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;
}
答案 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作为参数传递。