android - Firebase 使用 endAt if 时间戳字段

标签 android firebase firebase-realtime-database

我有包含此字段的记录:

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/

相关文章:

android - 如何让 EditText 提示不换行?

java - 将选定的对象传递给另一个 Activity

android - 两个按钮相同宽度的android

swift - 如果用户已存在于数据库中,则拒绝创建用户

android - "Could not get resource"Android Studio Gradle同步错误

java - 以编程方式锁定屏幕

javascript - React + Firebase undefined 使用点击事件

node.js - Firebase反向dns查找ENOTFOUND错误node.js dns

ios - 如何在 Firebase 中附加到带有其他对象的路径?

Swift 4 和 Firebase 如何计算子值