2017-02-25 4 views
0

Hey Ich möchte Zeit in Firebase-Datenbank als String in aufsteigender Reihenfolge gespeichert und in einer Liste anzeigen. Ich habe Lösungen zur Sortierung ganzzahliger Werte gefunden. databaseAndroid: Sortierzeit in Firebase-Datenbank in aufsteigender Reihenfolge gespeichert

Dies ist meine Datenbank, wo ich nach der timeTaken von jeder Benutzer-ID bei dieser spezifischen Frage ID sortieren möchte. Edit: Also meine Frage ist, wie kann ich die Daten von jedem Benutzer uid dieser spezifischen Zeit auf der Frage Frage ID (hier: 982906) abrufen und sortieren diese Liste, um herauszufinden, wer das Problem in kürzester Zeit gelöst hat.

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) { 

     } 
    }); 
} 

Ich habe die Werte der Zeit in der Datenbank als int in Millisekunden geändert, aber ich bin nicht in der Lage zu verstehen, wie die Werte der Frage ID 982906 Acording genommen zu der Zeit, zu sortieren. Ich habe die obige Methode ausprobiert, die immer 0 zurückgibt.

+1

Es sieht aus wie Ihre Zeiten schon sortierbar sind. Hattest du Probleme, es zu implementieren? Wenn ja, teile bitte den [minimalen Code, der das Problem reproduziert] (http://stackoverflow.com/help/mcve). –

+1

Es wird viel einfacher sein, wenn Sie Dinge wie Zeiten und Dauern als Integer-Wert statt als Anzeigetext-String speichern. Es wird das Sortieren einfacher machen. Wenn Sie die Uhrzeit anzeigen müssen, formatieren Sie sie auf dem Client mit dem Ganzzahlwert. –

+0

@FrankvanPuffelen Ich habe einen Code hinzugefügt. Es gibt Nullwerte zurück. Bitte überprüfen Sie –

Antwort

1

A Firebase Datenbank filtert die Kinder sofort unter dem Speicherort, Sie fragen ab, basierend auf einer einzelnen Eigenschaft (oder anderen Bedingung), die Sie angeben. Die Abfrage kann nicht auf einem dynamischen Pfad unter den untergeordneten Knoten basieren.

Sie verschachteln Daten auf eine Weise, die diese Abfrage nicht zulässt: Jede Antwort ist eine dynamische Ebene tiefer im Baum: `/ users/$ uid/questions/$ qid". Dies ist einer der vielen Gründe, warum die Firebase-Dokumentation auf diese Weise das Verschachteln von Daten empfiehlt

Wenn Sie eine Liste von Antworten für alle Benutzer nach ihrer "Zeit" abfragen möchten, sollten Sie genau das in Ihrer Datenbank speichern: eine Liste mit Antworten, die jeweils mit ihrer „Zeit genommen“

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

Jetzt können Sie die 10 schnellste Antwort zu Frage 42 mit bekommen.

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()); 
    } 
    } 
0

Sie können dies erreichen, indem Sie ein Datenmodell von Answer erstellen und comparator verwenden, um die Elemente nach Datum zu sortieren.

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

bearbeiten mit Ihrem Fall entsprechen, werden Sie den Zeit-String mit SimpleDateFormat vor Daten zu vergleichen, wie unten analysieren müssen:

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()); 
Verwandte Themen