Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase查询从Android应用程序下载大量数据_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Firebase查询从Android应用程序下载大量数据

Firebase查询从Android应用程序下载大量数据,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在从Android应用程序向Firebase进行查询,查询如下: 问题1 reference.orderByChild("started").equalTo(true)..addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { gameOnList.clear();

我正在从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条记录,但在本例中仅消耗10KB

我如何才能在不过度消耗数据的情况下进行第一次查询

查阅的数据库有大约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
                               ....

总结注释:如果使用筛选运算符
equalTo
startAt
endAt
构建查询,则应为所选子节点的安全规则添加索引

没有它们,客户端被迫执行相当于“完全扫描”——下载每个孩子,但只报告符合条件的孩子


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

总结评论:如果您使用过滤运算符
equalTo
startAt
endAt
构建查询,则应为所选子节点的安全规则添加索引

没有它们,客户端被迫执行相当于“完全扫描”——下载每个孩子,但只报告符合条件的孩子


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

如何衡量这些方法中每种方法的数据消耗?当您从Firebase数据库中选择数据时,您真的需要每个游戏的所有详细信息吗?或者可能只有那个键/另一个值?你在
started
child上有索引吗?ishmaelMakitla我在android手机上用网络计数器测量数据消耗。vzsg没有,我会尝试做索引,thanksHow你测量每种方法的数据消耗吗?当你从Firebase数据库中选取数据时,你真的需要每场比赛的所有细节吗?或者可能只有那个键/另一个值?你有关于
启动的
孩子的索引吗?ishmaelMakitla我用安卓手机中的网络计数器测量数据消耗。vzsg没有,我会尝试做索引,谢谢