【问题标题】:How to get sorted data from Firebase Database?如何从 Firebase 数据库中获取排序数据?
【发布时间】:2017-05-24 08:05:17
【问题描述】:

如何从 Firebase 数据库中的所有用户中获取具有名称和 userScore 的 前三个 用户(可能在 HashMap 中)? HashMap 必须按 userScore 排序。或者得到 ArrayList<User> usersList 和三个按 userScore 排序的用户。 database

{"top_clicker_db" : { 
    "total_clicks" : 3401,
    "user" : {
      "-KkePRVzO_lLLgp7fqX0" : {
        "name" : "fly",
        "userScore" : 2000
      },
      "-KkjWk0L2lR8RwUXF2Bd" : {
        "name" : "lg",
        "userScore" : 24
      },
      "-KkjjxNw8fj_XG9uUPEg" : {
        "name" : "fjfg",
        "userScore" : 304
      },
      "-KkjoakdLIjYlBEM1pkq" : {
        "name" : "Geny",
        "userScore" : 100
      },
      "-KklVAOkk2WJaRmH9cKk" : {
        "name" : "fly",
        "userScore" : 941
      }
    }
  }
}

我需要:

fly=2000;
fly=941;
fjfg=304;

【问题讨论】:

    标签: java android database firebase getvalue


    【解决方案1】:

    为了尽可能以最简单的方式解决问题,我建议您更改数据库结构,如下所示:

    {"top_clicker_db" : { 
        "total_clicks" : 3401,
        "user" : {
          "-KkePRVzO_lLLgp7fqX0" : {
            "fly" : 2000
          },
          "-KkjWk0L2lR8RwUXF2Bd" : {
            "lg" : 24
          },
          "-KkjjxNw8fj_XG9uUPEg" : {
            "fjfg" : 304
          },
          "-KkjoakdLIjYlBEM1pkq" : {
            "Geny" : 100
          },
          "-KklVAOkk2WJaRmH9cKk" : {
            "fly" : 941
          }
        }
      }
    }
    

    您需要一个具有the user name as the keythe score as the value 的孩子。这种结构的好处是您只需要查询一次。为此,请使用以下代码:

    DatabaseReference yourRef = FirebaseDatabase.getInstance().getReference().child("top_clicker_db").child("user").child(userId);
    Query query = yourRef.child(userName).orderByValue().limitToFirst(3);
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("TAG", dataSnapshot.getKey() + "=" + dataSnapshot.getValue());
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    query.addListenerForSingleValueEvent(eventListener);
    

    希望对你有帮助。

    【讨论】:

    • 谢谢。但我不能改变我的数据库结构。在我的应用程序中,我得到了用户对象。不过我会考虑的。
    • 好的。随时通知我。
    【解决方案2】:

    您在@alex-mamo 的回答中的评论中说您不能更改您的数据库结构,但是添加一个新节点怎么样?

    如果可以,非规范化数据也可能是一个不错的解决方案。 https://firebase.google.com/docs/database/web/structure-data

    "total_clicks" : 3401,
    "user" : {
      "-KkePRVzO_lLLgp7fqX0" : {
        "name" : "fly",
        "userScore" : 2000
      },
      "-KkjWk0L2lR8RwUXF2Bd" : {
        "name" : "lg",
        "userScore" : 24
      ...
    },
    "scores" : {
      "-KkePRVzO_lLLgp7fqX0" : {
        "fly" : 2000
      },
      "-KkjWk0L2lR8RwUXF2Bd" : {
        "lg" : 24
      },
      ...
    }
    

    【讨论】:

      【解决方案3】:

      我解决了这个问题。但现在我想如何将我的list 限制为 3 个用户。

      userRef.addValueEventListener(new ValueEventListener() {
                  @Override
                  public void onDataChange(DataSnapshot dataSnapshot) {
                      getTopThreeUsers((Map<String, Object>) dataSnapshot.getValue());
                  }
      
                  @Override
                  public void onCancelled(DatabaseError databaseError) {
                  }
              });
      
      private void getTopThreeUsers(Map<String, Object> users) {
              HashMap<String, Long> namesAndScores = new HashMap<>();
              for (Map.Entry<String, Object> entry : users.entrySet()) {
                  Map singleUser = (Map) entry.getValue();
                  namesAndScores.put((String) singleUser.get("name"), (Long) singleUser.get("userScore"));
              }
              Set<Map.Entry<String, Long>> set = namesAndScores.entrySet();
              List<Map.Entry<String, Long>> list = new ArrayList<>(set);
              Collections.sort(list, new Comparator<Map.Entry<String, Long>>() {
                  public int compare(Map.Entry<String, Long> o1, Map.Entry<String, Long> o2) {
                      return (o2.getValue()).compareTo(o1.getValue());
                  }
              });
      
              topName1.setText(list.get(0).getKey());
              topName2.setText(list.get(1).getKey());
              topName3.setText(list.get(2).getKey());
      
              topScore1.setText(String.valueOf(list.get(0).getValue()));
              topScore2.setText(String.valueOf(list.get(1).getValue()));
              topScore3.setText(String.valueOf(list.get(2).getValue()));
          }
      

      【讨论】:

        猜你喜欢
        • 2016-12-16
        • 2020-07-21
        • 1970-01-01
        • 2022-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-17
        相关资源
        最近更新 更多