我需要在 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"
}
}
}
答案 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
}
});
}
}
另见: