来自Android应用程序的Firebase查询下载了大量数据

时间:2016-11-20 20:00:58

标签: android firebase firebase-realtime-database

我正在从Android应用程序查询Firebase,查询如下:

查询1

reference.orderByChild("started").equalTo(true)..addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            gameOnList.clear();
                for (DataSnapshot gamesSnapshot : dataSnapshot.getChildren()){
                    Game game = gamesSnapshot.getValue(Game.class);
                    if(game.isStarted()) gameOnList.add(game);
                }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

此查询返回5个结果,但消耗量为1.5 Mb,就像它返回所有记录一样。可能会发生什么?

我已经做了另一个测试,下面的查询不会发生消耗数据:

查询2

Reference.limitToLast (5) .addValueEventListener (new ValueEventListener () {            
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            gameOnList.clear();
                for (DataSnapshot gamesSnapshot : dataSnapshot.getChildren()){
                    Game game = gamesSnapshot.getValue(Game.class);
                    if(game.isStarted()) gameOnList.add(game);
                }
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

还返回5条记录,但在这种情况下仅消耗10 kb。

如果不过度消耗数据,我怎样才能进行第一次查询?

咨询的数据库有大约1800条记录。

数据库的结构如下:

Game: 
          -KW_-cgwIPt5E8lzguds:
                               level1: array
                               level2: array
                               level3: array
                               level4: array
                               player1: String
                               player1Pts: int
                               player2: String
                               player2Pts: int
                               player1End: boolean
                               player2End: boolean
                               started: boolean
                               completed: boolean
          -KW_-cgwIPt5E8lztyd5:
                               level1: array
                               ....

1 个答案:

答案 0 :(得分:2)

总结评论:如果使用过滤运算符equalTostartAtendAt构建查询,则应将索引添加到所选子节点的安全规则。

如果没有它们,客户端将被迫执行相当于“完全扫描”的操作 - 下载每个孩子,但仅报告符合条件的那些

由于这个原因,对应用程序日志的任何不符合查询都会打印一条警告。或者,如果您尝试使用REST API执行相同的查询,它将立即被拒绝。