如何一次将从Firebase中检索到的数据存储在ArrayList <string>中?

时间:2017-01-21 07:21:48

标签: java android arraylist firebase firebase-realtime-database

我在数据库中有相同引用的数据,并且我试图将其存储在ArrayList<String>中。

以下是:

    mDatabase.child("child").child(uid).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            if (dataSnapshot.getValue() != null){
               ids.add(dataSnapshot.getValue().toString());
               Log.d("ids", ids.toString());
            } else {
                Toast.makeText(getBaseContext(), "No data!", Toast.LENGTH_SHORT).show();
            }

        }
        ...
        ...
    });

引用mDatabase.child("child").child(uid)...中存储了2个密钥,它们将逐个存储在ids中:

D/ids: [-Kayr_ENTy4QZQKn3Bgx]
D/ids: [-Kayr_ENTy4QZQKn3Bgx, -KaywN_5pTOrB0ooBIC3]

我想知道的是是如何让它们在ids而不是一个一个地添加?

更新1 : -

数据结构有点像这样:

-app
  -child
    -uid
      -1484967071: -Kayr_ENTy4QZQKn3Bgx
      -1484967222: -KaywN_5pTOrB0ooBIC3

并按照cartant的建议使用valueEventListener()会导致检索到此内容:

D/ids: [{1484967222=-KaywN_5pTOrB0ooBIC3, 1484967071=-Kayr_ENTy4QZQKn3Bgx}]

虽然我只想要密钥,-KaywN_5pTOrB0ooBIC3-Kayr_ENTy4QZQKn3Bgx

1 个答案:

答案 0 :(得分:4)

如果您希望将整个快照传递给收听者,请使用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());
    }
}