Firebase查询按创建时间过滤,日期大于现在

时间:2016-09-20 06:48:04

标签: android firebase firebase-realtime-database

我是Firebase的新手,我正在尝试用它创建一个应用程序。

我的应用包含在特定时间创建的帖子,并且包含特定时间。

我按以下方式存储数据:

"posts" : {
    "postid1" : {
      "author" : {
        "full_name" : "author1",
        "uid" : "idauthor1"
      },
      "date" : 1474455840809,
      "description" : "",
      "title" : "Test 1"
    },
    "postid2" : {
      "author" : {
        "full_name" : "author1",
        "uid" : "idauthor1"
      },
      "date" : 1480424400622,
      "description" : "",
      "title" : "Test 2"
    }
}

postID会自动生成,因此应该足以按创建时间排序,但我也想排除今天过去的日期(现在)。< / p>

有没有人知道我应该/应该怎么做?

2 个答案:

答案 0 :(得分:8)

我想你用“ServerValue.Timestamp”保存日期。

我认为您想要实现的目标是不可能的,因为您应该将日期(今天)作为参数传递,并且不能放置ServerValue.Timestamp。

我要做的是以这种方式查询所有帖子:ref.orderByChild("date")

然后在客户端进行过滤。

修改 这应该工作。 (它返回今天之后的当地时间的帖子)

query.orderByChild("date").startAt(new DateTime().getMillis())

然后你应该在客户端按键排序

答案 1 :(得分:2)

对此的查询应为

// server_timestamp is a long type variable
ref.child("posts").orderByChild("date").startAt(server_timestamp);

问题是(如@Bonja所述),您无法将Firebase的常量ServerValue.TIMESTAMP传递给该方法。

所以,您可以这样做(不推荐,因为时间基于用户的设备时区,可能无法正确同步)

Long server_timestamp = new Date().getTime();

或我自己的hacky方式(将ServerValue.TIMESTAMP保存到特殊节点然后获取值。是的,这需要做很多工作)

ref.child("current_timestamp").setValue(ServerValue.TIMESTAMP, new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Long server_timestamp = dataSnapshot.getValue(Long.class);
                ref.child("posts").orderByChild("date").startAt(server_timestamp).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Post post = dataSnapshot.getValue(Post.class);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {}
                });
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        });
    }
});

希望这会有所帮助:)