Firebase数据库从过滤器中返回数据

时间:2018-10-05 10:37:30

标签: java android firebase firebase-realtime-database

Firebase返回的数据与我想要的查询不匹配。

我的域类类似于

Event {

long eventDate
//many other irrelevant stuff
}

我希望检索10个下一个事件(今天之后)(SQL类似于:
Select * from event e where e.eventDate > now() order by e.eventDate ASC limit 10

然后我正在执行以下请求:

fire.child("event").orderByChild("eventDate").startAt(System.currentTimeMillis() + 1, "eventDate").limitToFirst(10).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        List<Giveaway> page = new ArrayList<>(PAGE_SIZE);

            for (DataSnapshot evs : dataSnapshot.getChildren()) {

                    Event da = evs.getValue(Event.class);
                    long s = System.currentTimeMillis();
                    long w = da.eventDate;
        System.out.println(s < w); //IN APP CHECK
]
    }}

但此查询返回的所有结果均显示打印false

1 个答案:

答案 0 :(得分:0)

我之所以回答这个问题,是因为将来有人遇到同样的问题,因为Google的api会反其道而行之地

根据firebase:   https://firebase.google.com/docs/reference/android/com/google/firebase/database/Query

  

startAt(布尔值,字符串键)创建一个仅限于   返回值大于或等于给定子节点   值,使用给定的orderBy指令或优先级作为默认值,以及   另外,只有子节点的键大于或等于   给定密钥。

所以我坚决.startAt(System.currentTimeMillis() + 1, "eventDate")将返回子节点eventDate大于System.currentTimeMillis() + 1的节点,但实际上startAt上的第二个参数用于比较每个节点的密钥< / p>

所以这使我的查询逻辑被彻底破坏了

删除startAt的第二个参数使返回值符合预期