hier是我的firebase模型
"messages" : {
"Johnny_peter" : {
"-KsjbzGUO90vejwHpzqx" : {
"message" : "how are u doing",
"user" : "peter",
"userName" : "peter"
}
},
"guy_johnz" : {
"-Ksj5vkO5H4qeleFqojh" : {
"message" : "merci",
"user" : "guy",
"userName" : "steve"
}
"guy_steve" : {
"-Ksj5vkO5H4qeleFqojh" : {
"message" : "merci",
"user" : "williams",
"userName" : "steve"
}
“steve”是重复的,我想只检索一次username的值。 我正在使用以下代码
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference messagesRef = rootRef.child("messages");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
for(DataSnapshot dSnapshot : ds.getChildren()) {
String userName = dSnapshot.child("userName").getValue(String.class);
Log.d("TAG", userName);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
messagesRef.addListenerForSingleValueEvent(eventListener);
如何检索userName的所有值,当值重复时,只需要一个值。 我想要这个输出: 彼得, 史蒂夫
答案 0 :(得分:0)
您无法阻止Firebase在不为其创建专用数据结构的情况下检索重复的用户名。
但您可以在Java代码中删除重复的名称:
public void onDataChange(DataSnapshot dataSnapshot) {
Set<String> names = new HashSet<String>();
for(DataSnapshot ds : dataSnapshot.getChildren()) {
for(DataSnapshot dSnapshot : ds.getChildren()) {
String userName = dSnapshot.child("userName").getValue(String.class);
if (!names.contains(userName)) {
Log.d("TAG", userName);
names.add(userName);
}
}
}
}
但这不是检索唯一用户名列表的一种非常有效的方法。如果你想要这样,你应该考虑为这个用例建模数据结构。参见: