我是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>
有没有人知道我应该/应该怎么做?
答案 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) {}
});
}
});
希望这会有所帮助:)