Firebase,为什么 addValueEventListener 不会被触发?

时间:2021-06-15 10:53:31

标签: java android firebase firebase-realtime-database

我需要在 addChildEventListener 内的 Firebase 数据库中获取另一个子项的值,但 addValueEventListener 不会被触发。这意味着 user_name_list 将始终为空。我该如何解决这个问题?谢谢!

mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
                mess_list = new ArrayList<>();
                chat_id_list = new ArrayList<>();
                user_name_list = new ArrayList<>();
                for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
                    chat_id_list.add(String.valueOf(uniqueKey.getKey()));
                    mess_list.add(String.valueOf(uniqueKey.getValue()));
                    
                    mDatabase2 = FirebaseDatabase.getInstance().getReference();
                    mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                            user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                        }
                    });
 
                }

                list_fonct(mess_list, chat_id_list, user_name_list);
            }
            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, String s) {
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, String s) {
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
            }
        });

这是我的数据库结构。

{
  "all_ads" : {
    "companies" : {
      "VchGVZITqVVJMAcrI8bJ1WLxPdq2" : {
        "ads" : {
          "1_ad" : {
            "chat" : [ null, {
              "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "Hi!"
            }, {
              "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : "hello"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "a"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "b"
            }, {
              "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : "c"
            } ]
          }
        }
      }
    }
  },
  "usersacc" : {
    "TWTlzga3jEfkIy5euZ5lyBo9YHL2" : {
      "username" : "username1"
    },
    "gG0DoRAAFqUkWk8KZWKLb96yHXX2" : { 
      "username" : "username2"
    }
  }
}

1 个答案:

答案 0 :(得分:0)

问题不在于您的 ValueEventListener 没有被触发,而是您在此之前调用了 list_fonct

我将在底部包含一些链接以了解更多相关信息,但现在简单的解决方法是将调用 list_fonct 移动到用户数据所在的 onDataChange 中加载:

mDatabase.child("all_ads").child("companies").child(company_id).child("ads").child(ad_id).child("chat").addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, String s) {
        mess_list = new ArrayList<>();
        chat_id_list = new ArrayList<>();
        user_name_list = new ArrayList<>();
        for (DataSnapshot uniqueKey : dataSnapshot.getChildren()) {
            chat_id_list.add(String.valueOf(uniqueKey.getKey()));
            mess_list.add(String.valueOf(uniqueKey.getValue()));
            
            mDatabase2 = FirebaseDatabase.getInstance().getReference();
            mDatabase2.child("usersacc").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                    user_name_list.add(String.valueOf(dataSnapshot2.child(String.valueOf(uniqueKey.getKey())).child("username").getValue()));
                    list_fonct(mess_list, chat_id_list, user_name_list); // ? moved here
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    throw databaseError.toException(); // ? never ignore errors
                }
            }); 
        }
    }

另见:

相关问题