如何在值重复时检索所有值只需获取一个值

时间:2017-09-09 14:11:17

标签: android firebase firebase-realtime-database

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的所有值,当值重复时,只需要一个值。 我想要这个输出: 彼得, 史蒂夫

1 个答案:

答案 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);
            }
        }
    }
}

但这不是检索唯一用户名列表的一种非常有效的方法。如果你想要这样,你应该考虑为这个用例建模数据结构。参见: