我有包含此字段的记录:
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;
}
}
添加新的随机项目
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"
最佳答案
您应该首先按 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);
}
通过这种方式,您可以告诉 Firebase 按节点的子节点之一(在本例中为时间戳
)对节点进行排序。希望这会有所帮助。
接下来您需要在客户端对数据进行排序。这样做的一个问题是,例如,来自 firebase 的实时更改不会对 RecyclerView
内的项目进行重新排序。
我再次建议您阅读this回答。
关于android - Firebase 使用 endAt if 时间戳字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576725/