2017-01-12 179 views
-1

我的結構檢索數據就像下面火力地堡:由子值排序

- Posts 
    - keu23jndf 
    - dateTime:"2376464" 
    - name:"abc" 
    - key34njf 
    - dateTime:"4333434" 
    - name:"xyz" 

現在,我要以降序來檢索日期時間排序的數據。

感謝

+0

使用哪種代碼語言?你想將它們從最新到最舊還是反向排序?這是什麼時間戳? – hotrod

+0

我正在使用Android,我想將它們從最新到最舊排序。 Timestamp就像Long timestamp = System.currentTimeMillis()/ 1000; –

回答

1

好了,所以首先我會建議你不要使用客戶端片面的時間戳,而是使用ServerValue.TIMESTAMP。在大多數情況下,這將是更好的設置。如果你知道自己在做什麼,並且想要完全如此,那就忘記這一點,然後繼續閱讀。

如果你想從最新到最舊排序的問題是,Firebase確實(據我所知)不支持這一點。

解決方法是使用Firebase ServerValue.TIMESTAMP的負值。

這就是我的做法。 它可能不是完美的或正確的方式,但它的工作

private void prepareUpload() { 
    //mDatabase is a reference to the root of the Firebase Database 
    final DatabaseReference timestampReference = mDatabase.child("timestamp"); 
    final String timestampKey = timestampReference.push().getKey(); 
    timestampReference.child(timestampKey).setValue(ServerValue.TIMESTAMP); 
    timestampReference.child(timestampKey).addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      if (dataSnapshot.getValue() != null) { 
       Long timestamp = 0 - Long.parseLong(dataSnapshot.getValue().toString()); 
       upload(/*Starting upload with new timestamp here (this is just a dummy method)*/); 
       timestampReference.child(timestampKey).removeValue(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.e(TAG, databaseError.getMessage()); 
     } 
    }); 
} 

現在你必須設置你的火力地堡數據庫規則如下:

"Posts": { 
    ".indexOn" : "date", 
    ... 
} 

最後你只需要查詢您的'Posts'不知怎麼這樣的:

mDatabase.child("Posts").orderByChild("dateTime").addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      //Do stuff with your data 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

希望這有助於!

+0

我想addValueEventListener –

+0

然後,只需將'ChildEvent'監聽器更改爲'ValueEvent'監聽器。 – hotrod

+0

這不起作用 –