【问题标题】:Android: Sorting time stored in firebase database in ascending orderAndroid:按升序对存储在firebase数据库中的时间进行排序
【发布时间】:2017-02-25 19:04:35
【问题描述】:

嘿,我想按升序对存储在 firebase 数据库中的时间进行排序,并将其显示在列表中。我找到了有关排序整数值的解决方案。

这是我的数据库,我想根据每个用户 ID 在该特定问题 ID 处的 timeTaken 进行排序。 编辑: 所以我的问题是如何从每个用户 uid 中检索该 question id(此处为:982906)所花费的特定时间的数据并对该列表进行排序以检索谁在最短的时间内解决了问题.

private void getTimeTaken() {

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("users");
    Query query = databaseReference.orderByChild("questions").startAt("982906");
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            yourTimeArraylist = new ArrayList<>();
            for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                UserPuzzleDetails userPuzzleDetails = postSnapshot.getValue(UserPuzzleDetails.class);
                yourTimeArraylist.add(new UserPuzzleDetails(userPuzzleDetails.getYourAnswer(), userPuzzleDetails.getAnswerScore(), userPuzzleDetails.getTimeTaken()));
                Log.e("", " " + userPuzzleDetails.getTimeTaken());
            }

            for (int i = 0; i < yourTimeArraylist.size(); i++) {
                UserPuzzleDetails user = yourTimeArraylist.get(i);
                Log.d("test your rank", " onDataChange: " + user.getTimeTaken() + " " + user.getAnswerScore());

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

我已将数据库中的时间值更改为 int,以毫秒为单位,但我无法理解如何根据所用时间对问题 id 982906 的值进行排序。我试过上面的方法,每次都返回0。

【问题讨论】:

  • 看起来您的时间已经可以排序了。您在实施时遇到问题吗?如果有,请分享minimal code that reproduces the problem
  • 如果将时间和持续时间等内容存储为整数值而不是显示文本字符串会容易得多。它将使排序更简单。然后,当您需要显示时间时,在客户端使用整数值对其进行格式化。
  • @FrankvanPuffelen 我添加了一些代码。它返回空值。请检查
  • @DougStevenson 谢谢,这是有道理的,所以我已将值更改为整数类型,但仍然面临一些问题

标签: java android firebase firebase-realtime-database


【解决方案1】:

Firebase 数据库会根据您指定的单个属性(或其他条件)过滤您查询的位置下的子项。查询不能基于子节点下的动态路径。

您以不允许此查询的方式嵌套数据:每个答案都是树中更深的一个动态级别:`/users/$uid/questions/$qid"。这是众多原因之一为什么 Firebase 文档建议不要以这种方式嵌套数据。

如果您想按“所用时间”查询所有用户的答案列表,则应将其准确存储在数据库中:答案列表,每个答案都带有“所用时间”。

questionAnswers
  $questionId
    $uid
      timeTaken: "08:17:23.6"

现在您可以获得第 42 题的 10 个最快答案:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
DatabaseReference answersReference = databaseReference.child("42");
Query query = answersReference.orderByChild("timeTaken");
query.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot userAnswerSnapshot: dataSnapshot.getChildren()) {
      System.out.println("User "+userAnswerSnapshot.getKey()+" took "+userAnswerSnapshot.child("timeTaken").getValue());
    }
  }

【讨论】:

  • 升序还是降序呢?怎么办?
【解决方案2】:

您可以通过创建 Answer 的数据模型并使用 comparator 通过比较日期对项目进行排序来实现这一点。

Collections.sort(listItemAnswer, new Comparator<AnswerInfoDto>() { 
@Override public int compare(AnswerInfoDto l, AnswerInfoDto r) 
{ // Compare l.timeTaken and r.timeTaken} }

编辑为了匹配您的情况,您必须在比较日期之前使用SimpleDateFormat 解析时间字符串,如下所示:

class StringDateComparator implements Comparator<String>
{
    SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss.SSS");
    public int compare(String lhs, String rhs)
    {
        return dateFormat.parse(lhs).compareTo(dateFormat.parse(rhs));
    }
}

Collections.sort(arrayList, new StringDateComparator());

【讨论】:

    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    相关资源
    最近更新 更多