2017-06-03 6 views
0

Ich benutze diese Abfrage, um die Beiträge von Benutzer A und sortieren nach Zeitstempel.Firebase wo Zustand mit orderBy in Android

Die folgende Abfrage ruft die Posts von Benutzer A ab, sortiert aber nicht nach Datum.

mDatabase = FirebaseDatabase.getInstance().getReference("posts"); 
    String UID = "userA"; 
    Query myTopPostsQuery = mDatabase.equalTo(UID).orderByChild("UID"); 

Ich habe versucht, unter Abfrage verwenden, aber es gibt eine leere Menge zurück.

Query myTopPostsQuery = mDatabase.equalTo(UID).orderByChild("date"); 

Was ist der richtige Weg, um mein Ergebnis zu erreichen?

Das ist meine Datenstruktur:

posts 
-KlgYXK01ezPjk 
    UID: "YiXgM3qgqcsd" 
    date: 1496428200000 
    post: "This is a Test Post by user A" 
    , 
-KlgYXK01ezPpl 
    UID: "YiXgM3qgqcsd" 
    date: 1496428220022 
    post: "This is another Test Post by user A" 
    , 
-KlgYXK01ezKjk 
    UID: "YiXCWsdj712" 
    date: 1496428203000 
    post: "This is a Test Post by user B" 
    , 

Antwort

0

auch dies ist nicht die genaue Antwort kann man erwarten, aber es HELOs wenn Ihre App skaliert

Ich empfehle Ihnen, verwenden Sie ein Fan Datenstruktur aus.

Damit erstellen Sie einen separaten Knoten user-posts, wo Sie alle speichern die Beiträge von einzelnen Benutzern wie unten:

user-posts 
-YiXgM3qgqcsd //this us A's UID 
    KlgYXK01ezPjket4ery62 
     post: "This is a Test Post by user A" 
     date: 1496428200000 
     author:'A' 
     KlgYXK01ezPjket4ery62 
     post: "This is a 2nd Test Post by user A" 
     date: 1496428500000 
     author:'A'  
    KlgYXK01ezPjket4ery62 
     post: "This is a 3rd Test Post by user A" 
     date: 1496428600000 
     author:'A'  
-YiXCWsdj712 //this us B's UID 
    KlgYXK01ezPjket4ery62 
     post: "This is a Test Post by user B" 
     date: 1496428200000 
     author:'B' 

Jetzt können Sie für A Beiträge lik Abfrage:

mDatabase = FirebaseDatabase.getInstance().getReference("user-posts"); 
    String UID = "userA"; 
    Query myTopPostsQuery = mDatabase.child(UID).limitToLast(10); 

Da Daten schieben in einen Knoten erstellt einen eindeutigen Schlüssel, die standardmäßig in chronologischer Reihenfolge sind Sie müssen sich keine Sorgen über die Sortierung nach Zeitleiste, wie Sie limitToLast() verwenden, die Sie Beiträge von unten gibt, dh letzte

So ist es besser, Sie drücken Daten auf verschiedene Knoten posts und user-posts, wenn ein Benutzer einen Beitrag erstellt. Das ist besser als das Schreiben von Daten ist billig in Feuerbasis im Vergleich zum Lesen von Daten

Jetzt können Sie nur Daten aus Lit. herausziehen "user-posts/UID" statt Feuerbasis Quering Daten von posts all Beiträgen von Benutzern Filterung A dann wieder von Timeline Bestellung die teuer und langsam sein, wenn Sie viele Anzahl der Beiträge

haben wenn es darum geht, Daten auf verschiedene Knoten zu schieben, dh posts und user-posts diese billig sein könnte und Sie updateChildren() Methode wie unten verwenden:

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 
// Generate a new push ID for the new post 
Firebase newPostRef = ref.child("posts").push(); 
String newPostKey = newPostRef.getKey(); 
// Create the data we want to update 
Map newPost = new HashMap(); 
newPost.put("title", "New Post"); 
newPost.put("content", "Here is my new post!"); 
Map updatedUserData = new HashMap(); 
updatedUserData.put("user-posts/" + newPostKey, true); 
updatedUserData.put("posts/" + newPostKey, newPost); 
// Do a deep-path update 
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Error updating data: " + firebaseError.getMessage()); 
     } 
    } 
});   

Sie könnten auf die Firebase Blogpost here

verweisen