Android:按升序排序存储在firebase数据库中的时间

时间:2017-02-25 19:04:35

标签: java android firebase firebase-realtime-database

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

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

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。

2 个答案:

答案 0 :(得分: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());
    }
  }

答案 1 :(得分:0)

您可以通过创建答案的数据模型来实现这一点,并使用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());