2017-01-10 20 views
2

我有這個字段的記錄:火力地堡使用ENDAT如果時間戳字段

age: 25 
timestamp: 1484089199472 

該記錄由插入:

@Exclude 
public Map<String, Object> toMap() { 
    HashMap<String, Object> result = new HashMap<>(); 

    result.put("age", age); 
    result.put("timestamp", ServerValue.TIMESTAMP); 
    return result; 
} 

如果我使用endAt(24,"age")比其工作良好,該項目是不可見的。

但是,如果我想在時間戳endAt使用它不工作。例如: endAt(100000,"timestamp")並且該行保持可見狀態。 爲什麼?

這是檢查類型?

如何過濾?

我沒有任何想法! :( 我希望有人能幫助我 感謝

編輯:!

查詢爲得到實際日行

@Override 
    public Query getQuery(final DatabaseReference databaseReference) { 
     Date endTime = new Date(); 
     endTime.setHours(23); 
     endTime.setMinutes(59); 
     endTime.setSeconds(59); 

     return databaseReference 
       .child("toplist") 
       .endAt(endTime.getTime(),"timestamp") 
       .orderByChild("point") 
       .limitToFirst(50); 

    } 

數據

@IgnoreExtraProperties 
public class Rank{ 

    public int number; 
    public String username; 
    public int point; 


    // [START post_to_map] 
    @Exclude 
    public Map<String, Object> toMap() { 
     HashMap<String, Object> result = new HashMap<>(); 
     result.put("number", number); 
     result.put("username", username); 
     result.put("point", point); 
     result.put("timestamp", ServerValue.TIMESTAMP); 
     return result; 
    } 

} 

添加新的隨機item

private void writeNewRandomTopListItem() { 
     Random rnd = new Random(); 
     Rank item = new Rank(); 
     item.username = "Test " + rnd.nextInt(20000); 
     item.point = rnd.nextInt(2000000); 

     mDatabase.child("toplist").push().setValue(item.toMap()); 
    } 

適配器

Query postsQuery = getQuery(mDatabase); 
     mAdapter = new FirebaseRecyclerAdapter<Rank, PostViewHolder>(Rank.class, R.layout.item_post, PostViewHolder.class, postsQuery) { 
      @Override 
      protected void populateViewHolder(final PostViewHolder viewHolder, final Rank model, final int position) { 

       viewHolder.bindToPost(model,position); 
      } 
     }; 
     mRecycler.setAdapter(mAdapter); 

...

toplist 
    -Ka8m3hN-vRjPZhKH3Rt 
    number: 0 
    point: 1269424 
    timestamp: 148407253222471 
    username: "Test 19727" 
    -Ka8m3hWRIQKL7faNqUS 
    number: 0 
    point: 1398061 
    timestamp: 1484075322472 
    username: "Test 17679" 
+1

您可以提供更高級別的數據庫數據以及更多關於您所調用的確切查詢的更多代碼嗎?如果你願意,我很確定我能幫助你。 – hotrod

+0

謝謝你的幫助。我編輯了我的帖子。 – ketom

回答

4

您應該由timestamp孩子第一次下訂單節點,通過points在客戶端其次責令接收的項目。這被描述爲here

我會建議你使用此查詢代替:

@Override 
public Query getQuery(final DatabaseReference databaseReference) { 
    Date endTime = new Date(); 
    endTime.setHours(23); 
    endTime.setMinutes(59); 
    endTime.setSeconds(59); 

    return databaseReference.child("toplist").orderByChild("timestamp") 
      .endAt(endTime.getTime()).limitToFirst(50); 
} 

這樣,你告訴火力地堡通過在這種情況下會timestamp他們的孩子節點中的一個節點的排序。希望這可以幫助。

接下來,您需要在客戶端對數據進行排序。這樣做的一個問題是,例如,從firebase實時更改不會重新排序您的項目在RecyclerView之內。

我再次建議通過this答案閱讀。

+0

endAt現在工作很好。但是我得到了第二個orderByChild的錯誤 – ketom

+1

java.lang.IllegalArgumentException:你不能合併多個orderBy調用! – ketom

+0

是的,你是對的,忘記了。我會編輯我的答案。 – hotrod