如何在Android中一次将多个查询发送到Firebase数据库而不会陷入循环

时间:2019-02-15 01:21:41

标签: java android firebase firebase-realtime-database

我试图查询数据库以检查多个不相关的键,以检查参数并编译适合我条件的列表。

我已经有一个列表,该列表是通过对数据库另一个节点的先前查询创建的。哪个返回了我要检查的键列表。

现在,我想遍历此列表并查询它们,看看它们是否符合我的条件。

我尝试下载整个节点并检查客户端,但是如果节点增长并下载大量不必要的数据,这将变得非常缓慢。

我尝试绕过查询循环,并在列表中的键上发送多个查询。如果我不满足我的原始条件,这会起作用,但是随着我尝试以不同的条件回到起点,变得越来越复杂。

for (int i = 0; i < nextUp.size(); i++) {
    Query query = myRef.child(nextUp.get(i).toString());
    query.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            boolean v = false;

            for (DataSnapshot likesSnapshot : dataSnapshot.getChildren()) {
                if (uid.equals(likesSnapshot.getKey())) {
                    v = true;
                } else {
                }

                //b if for second pass with different conditions
                if (b) {
                    if (!v) {
                        complieList(dataSnapshot.getKey(), b);
                    }

                    if (!b) {
                        complieList(dataSnapshot.getKey(), b);
                    }
                }

            }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
}

到我的代码回到开头时,所有查询尚未完成。因此,我需要等待所有操作完成才能继续。但这需要等待许多查询的结果,因此我不能简单地将其放在onDataChange中。我已经看到JavaScript承诺可以在管道中一次发送多个查询并接收所有查询的结果。有没有办法在Java中做到这一点。

更新

这里是我想要做什么的链接,但这是针对javascript的 Querying By Multiple Keys in Firebase

1 个答案:

答案 0 :(得分:0)

您考虑使用交易吗?

事务用于复合服务器数据库请求和请求一次。

它还用于防止在db请求期间更改数据。

https://firebase.google.com/docs/reference/android/com/google/firebase/database/Transaction.Handler?hl=ko

顺便说一句,实时数据库不支持复杂查询

您只能使用orderbychild ..等

但是您可以在保存数据时分别存储数据。