2017-03-26 4 views
0

First off, hier ist meine Datenbankstruktur:Wie erhält man zufällige Kinder eines Firebase-Knotens?

firebase database structure

Mein Ziel später eine zufällige Frage Objekt aus dem „DE“ Knoten zu erhalten war, um es anzuzeigen, und da es keine eingebaute Unterstützung ein zufälliges Kind zum Abfragen Ich muss irgendwie ein zufälliges Objekt von diesem Iterator bekommen.

Derzeit habe ich diesen Code, aber ich bin verwirrt, wie man es aneinanderzureihen:

DatabaseReference questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE"); 

questionsRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int questionCount = (int) dataSnapshot.getChildrenCount(); 
     int rand = random.nextInt(questionCount); 
     Iterator itr = dataSnapshot.getChildren().iterator(); 
    } 
    // onCancelled(){} 
}); 
+0

Siehe http://stackoverflow.com/q/40765613 oder http://stackoverflow.com/q/40853157 oder http://stackoverflow.com/q/42186839 –

+0

@FrankvanPuffelen Danke, ich glaube nur der dritte Link ist eigentlich, worum ich gefragt habe (erste und zweite Frage sind nicht was das ist), und in dieser Lösung erstellt es zuerst eine Liste und fügt dann alles hinzu, nur um eines zurückzubekommen. –

Antwort

1

Grundsätzlich müssen Sie nur genug itr.next() tun, bis der Iterator am n ten Position ist (wo n ist die Zufallszahl von nextInt()) und dann können Sie einfach das Objekt, das Sie mit getValue() wollen erhalten, das folgende Beispiel sollte es zeigt auch:

questionsRef = FirebaseDatabase.getInstance().getReference().child("questions").child("DE"); 

questionsRef.addListenerForSingleValueEvent(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     int questionCount = (int) dataSnapshot.getChildrenCount(); 
     int rand = random.nextInt(questionCount); 
     Iterator itr = dataSnapshot.getChildren().iterator(); 

     for(int i = 0; i < rand; i++) { 
      itr.next(); 
     } 
     childSnapshot = (DataSnapshot) itr.next(); 
     question = childSnapshot.getValue(Question.class); 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError) { 

    } 
}); 
+0

Wenn Ihre Datenbank sehr groß ist, können Sie 'Firebase Functions' für diesen Zweck verwenden! – Dexter

Verwandte Themen