Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-Firebase如何在每个ArrayList值下分配子值?_Java_Android_Arraylist_Firebase Realtime Database - Fatal编程技术网

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

Java Android-Firebase如何在每个ArrayList值下分配子值?,java,android,arraylist,firebase-realtime-database,Java,Android,Arraylist,Firebase Realtime Database,我正在尝试制作一个事件分类器应用程序。我试图从数据库中获取friends arraylist,并在数据库中的每个friend值下添加event_键 final ArrayList<String> friends= new ArrayList<String>(); hello.addListenerForSingleValueEvent(new ValueEventListener() { @Override public

我正在尝试制作一个事件分类器应用程序。我试图从数据库中获取friends arraylist,并在数据库中的每个friend值下添加event_键

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) {

             }
         });

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

因为Firebase是一个NoSQL数据库,所以它的结构是成对的键和值。因此,每个子元素都是一个
映射
,而不是一个数组列表。确实,您可以从数据库中获取一个值并将其存储到ArrayList中,但不是以您这样做的方式,因为
onDataChange()
方法的异步行为,您的
friends
ArrayList将始终为空。之所以会发生这种情况,是因为在您尝试将这些值添加到ArrayList之前,就调用了
onDataChange()
方法

如果要为所有响应每个用户的
事件键
设置
true
,并假设
Events
节点是Firebase数据库的直接子节点,请使用以下代码:

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);

因为Firebase是一个NoSQL数据库,所以它的结构是键和值对。因此,每个子元素都是一个
映射
,而不是一个数组列表。确实,您可以从数据库中获取一个值并将其存储到ArrayList中,但不是以您这样做的方式,因为
onDataChange()
方法的异步行为,您的
friends
ArrayList将始终为空。之所以会发生这种情况,是因为在您尝试将这些值添加到ArrayList之前,就调用了
onDataChange()
方法

如果要为所有响应每个用户的
事件键
设置
true
,并假设
Events
节点是Firebase数据库的直接子节点,请使用以下代码:

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);

令人惊叹的!非常感谢。令人惊叹的!非常感谢。