3

Ich versuche zu bestellen und filtern Sie die Daten mit Firebase Echtzeit-Datenbank. In einem Fall möchte ich OrderByKey verwenden (weil ich zuerst neue Fragen haben möchte und Schlüssel mit der Push-Funktion erzeugt werden), um die Daten zu sortieren, in einem anderen Fall benutze ich OrderByChild (weil ich nach Timestamp sortieren möchte und in diesem Fall nicht t benutze push aber ich nutze die uid des benutzers als schlüssel).OrderByKey funktioniert gut, aber OrderByChild gibt unerwartete Ergebnisse in Firebase-Echtzeit-Datenbank

In beiden Fällen möchte ich das neueste Ding/Person (Frage/Benutzer) zuerst, also möchte ich in absteigender Reihenfolge bestellen (auf der Client-Seite, die ich sogar umgekehrt). So frage ich nach der ersten Abfrage. Erste Abfrage hat einfach nicht endAt(endAtKey) Teil in der unten gezeigten Abfrage.

Für OrderByKey:

ref.child("questions").orderByKey().endAt(endAtKey).limitToLast(10); 


    //data at questions node looks like this 
    { 
    "-L1CbnCkXJiRT9MKpoP1" : { 
    "mCorrectAnswer" : 1, 
    "mOptionA" : "ueud", 
    "mOptionB" : "h", 
    "mOptionC" : "h", 
    "mOptionD" : "h", 
    "mProblem" : "4shsudududududududurududu" 
    }, 
    "-L1Dd9x6ws5di2rf8yay" : { 
    "mCorrectAnswer" : 1, 
    "mOptionA" : "sh", 
    "mOptionB" : "shsh", 
    "mOptionC" : "hehs", 
    "mOptionD" : "hssh", 
    "mProblem" : "12ffsnsjsjdbxbddhdbdbddjebddb" 
    } 

Für OrderByChild:

mDatabaseReference.child("user_list").orderByChild("mTimeStamp") 
         .endAt(endAtKey).limitToLast(10); 



    //data at user_list reference looks like this 
    { 
    "VH78axip1bXN9dktsF4Az0oBche2": 
    "mTimeStamp": "1508782492973", 
    "mUserName": "Satyam Kumar" 
    }, 
    "2MedW9KSYTcB8I1qp0xcoNuwPEf1": 
    "mTimeStamp": "1508823085614", 
    "mUserName": "Thirunagari Yeshwanth" 
    } 

ich die RecyclerView mit den Daten in Gruppen von 10 so in onDataChange auffüllen möchten speichere ich den Schlüssel des ersten Kind erhalten in onDataChange Methode.

 if (countCopy == 1) { // while iterating through children this variable tells 
//the index of the loop. 

           endAtKey = currentKey; 
           Log.e("endKey", endAtKey); 
          } 

Jetzt ist das Problem I ist mit der Abfrage in späterem Abrufen von Daten sind vor über ich die endAtKey feinen empfängt (empfangenen Daten sind auch das, was zu erwarten ist) für OrderByKey Abfrage aber endAtKey ist immer das gleiche für OrderByChild Abfrage und die empfangenen Daten sind immer gleich. Wie kann ich dieses Problem lösen?

+0

Wenn Sie das Protokoll von Ihrer 'OrderByChild'-Abfrage betrachten, ist der 'endAtKey' eine UID oder ein Zeitstempel? –

+0

@ RosárioPereiraFernandes ist es Zeitstempel. Oh ich denke, ich habe das Problem mit deinem Kommentar, danke ich werde es mit Uid versuchen. :) –

+0

@ RosárioPereiraFernandes Ich habe noch einmal überprüft, dass ich im vorherigen Kommentar falsch gesagt habe. Es ist Uid, das ich benutze. Also denke ich, ich sollte es mit timeStamp machen, weil wir das gerade abfragen. Ich werde es nochmal mit dem Zeitstempel überprüfen. –

Antwort

3

Das Problem mit Ihrer OrderByChild Abfrage ist, dass die endAtKey, dass Sie ist ein Schlüssel anstelle ein timestamp bekommen. Denken Sie daran, dass OrderByChild für die Abfrage des Zeitstempelattributs verwendet wird. Daher muss endAtKey ein Zeitstempel und kein Schlüssel sein.

Verwandte Themen