2017-01-10 18 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