Android- Firebase如何在每个ArrayList值下分配子值?

时间:2017-09-20 08:26:20

标签: java android arraylist firebase-realtime-database

我正在尝试制作一个事件分拣机应用。我试图从数据库中抓取朋友arraylist,并在数据库中的每个朋友值下添加event_key。

final ArrayList<String> friends= new ArrayList<String>();
hello.addListenerForSingleValueEvent(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {

                 for (DataSnapshot dsp : dataSnapshot.getChildren()) {
                     friends.add(String.valueOf(dsp.getKey())); 
                 }

                 mDatabaseUserEvents.child(invited_list).child(event_key).setValue(true);
             }

             @Override
             public void onCancelled(DatabaseError databaseError) {

             }
         });

但是,我收到一条错误消息,指出ArrayList不兼容。

我试图瞄准的数据库结构是:

Events:
       -User1:
              -event_key:true
       -User2:
              -event_key:true

我很确定我需要使用for循环,但对如何实现它感到困惑。谢谢!

1 个答案:

答案 0 :(得分:2)

由于Firebase是NoSQL数据库,因此它的结构为键和值对。所以每个孩子都是Map而不是ArrayList。确实,您可以从数据库中获取值并存储到ArrayList中但不是以您的方式存储,因为onDataChange()方法的异步行为,您的friends ArrayList将始终如此是空的。这种情况正在发生,因为即使在尝试将这些值添加到该ArrayList之前,也会调用onDataChange()方法。

如果您要为每个用户的所有true设置event_key,并假设Events节点是Firebase数据库的直接子节点,请使用以下代码:< / p>

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference eventsRef = rootRef.child("Events");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userKey = ds.getKey();
            Log.d("TAG", userKey);
            eventsRef.child(userKey).child("event_key").setValue(true);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
eventsRef.addListenerForSingleValueEvent(eventListener);