firebase数据库键到arraylist

时间:2017-06-23 16:38:40

标签: java android firebase firebase-realtime-database

我正在尝试将firebase数据库中的密钥添加到onDataChange方法中的arraylist。

        mDatabase = FirebaseDatabase.getInstance().getReference("events");
    mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()) {
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {

                            String event = snapshot.getKey();
                            Log.d("did it work??", event);
                            eventList.add(event);
                        }
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });

当我记录事件时,它会打印但不添加到eventList arrayList

2 个答案:

答案 0 :(得分:3)

如果您希望将整个快照传递给收听者,请使用addValueEventListeneraddListenerForSingleValueEvent

如果使用addValueEventListener,将使用初始快照调用侦听器,如果数据库发生更改,则会再次调用侦听器。

如果您使用addListenerForSingleValueEvent,则只会使用初始快照调用一次侦听器。

听众收到的快照将包括所有孩子。要迭代它们,你会做这样的事情:

@Override
public void onDataChange(DataSnapshot snapshot) {
    ArrayList<String> ids = new ArrayList<String>();
    for (DataSnapshot childSnapshot: snapshot.getChildren()) {
        ids.add(childSnapshot.getValue().toString());
    }
}

答案 1 :(得分:1)

这种情况正在发生,因为onDataChange方法是异步调用的。这意味着在调用ArrayList方法之前执行将字符串添加到onDataChange()的语句。这就是为什么你的列表在该方法之外是空的。因此,为了使用ArrayList,您需要在onDataChange()方法中声明并使用它。

ArrayList<String> ids = new ArrayList<>();

如果您想在ArrayList方法之外使用onDataChange(),请参阅此post的答案。

希望它有所帮助。