所以Code现在看起来像这样。
问题是我获得了多个Logprints。但我只需要完整且完成的meberList。
for (String memberByNumber : memberListByNumber) {
mFirebaseDatabaseReference.child("userUidsByNumber/").child(memberByNumber).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String userUid = dataSnapshot.getValue().toString();
memberList.add(userUid);
Log.d("LOL", "ContactsAdapter: " + memberList);
} else {
Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show();
}
});
}
我希望你能理解我的问题,并能帮助我。 提前致谢。
答案 0 :(得分:0)
我想发表评论,但由于我在这里的声誉,我无法做到 所以,这是我的回答你将每个条目记录到一个文件中,这样它只会使打印必要的条目变得更加困难所以继续使用不同的路径并在现有的一个中再给出一个if-else语句并使用try-exception来分割完成的和取消进入某些缓存,然后使完成的文件无效
答案 1 :(得分:0)
如果为onDataChange
的每个成员调用memberListByNumber
,那么您可以尝试
final int total = memberListByNumber.size();
for (String memberByNumber : memberListByNumber) {
mFirebaseDatabaseReference
.child("userUidsByNumber/")
.child(memberByNumber)
.addValueEventListener(new ValueEventListener() {
int n = total;
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
String userUid = dataSnapshot.getValue().toString();
memberList.add(userUid);
if (--n <= 0) Log.d("LOL", "ContactsAdapter: " + memberList);
} else {
Snackbar.make(view, R.string.user_does_not_exist, Snackbar.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar.make(view, R.string.error, Snackbar.LENGTH_LONG).show();
}
});
}
答案 2 :(得分:0)
在firebase中,从来没有一个完整的列表。
只要任何数据在任何子节点下发生更改,值事件就会不断发生。此外,值事件最后发生,即在所有子事件完成之后,确保该点处的所有子节点都存在。下一个事件将为您提供该特定点的完整列表。
在每次数据更改调用中,您可以清除列表,添加所有新值并打印出来。这就是firebase的工作原理。
如果只需要整个列表一次并且不需要任何新更改,则可以使用addListenerForSingleValueEvent方法添加值事件侦听器。现在列表将被读取一次而不再读取。但是,如果启用了持久性,则数据将从手机缓存中读取一次,而不是从db
读取也许您正在寻找的是一个ChildEventListener,它将为您提供更精细的控制。这将有子项添加,删除和更改的事件,这将为您提供一次一个孩子的列表数据。
我不知道你的实际目的是什么,所以这是我能解释的最好的。希望这有帮助