Java 如果我想要快速更新,三级嵌套对Firebase来说是否太多了?

Java 如果我想要快速更新,三级嵌套对Firebase来说是否太多了?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我要做的是查询所有用户的当前位置,以便将他们放在地图上。不幸的是,即使我目前只有四个测试用户,返回结果也需要相当长的时间(有时长达10秒)。这真的是一个需要平整的结构吗 这是我用来获取每个用户的CurrentLocation实例的Java代码: public void showLooksieUsersOnMap() { final Firebase myFirebase = new Firebase(Constants.FIREBASE_URL); Quer

我要做的是查询所有用户的当前位置,以便将他们放在地图上。不幸的是,即使我目前只有四个测试用户,返回结果也需要相当长的时间(有时长达10秒)。这真的是一个需要平整的结构吗

这是我用来获取每个用户的CurrentLocation实例的Java代码:

public void showLooksieUsersOnMap() {

        final Firebase myFirebase = new Firebase(Constants.FIREBASE_URL);


        Query query = myFirebase.child("users").orderByKey();


        query.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildRemoved(DataSnapshot arg0) {

            }

            @Override
            public void onChildMoved(DataSnapshot arg0, String arg1) {

            }

            @Override
            public void onChildChanged(DataSnapshot arg0, String arg1) {

            }

            @Override
            public void onChildAdded(DataSnapshot arg0, String arg1) {

                String userId = arg0.getKey();

                Query query2 = myFirebase.child("users").child(userId)
                        .child("currentLocation");

                query2.keepSynced(true);

                query2.addListenerForSingleValueEvent(new ValueEventListener() {

                    @Override
                    public void onDataChange(DataSnapshot arg0) {

                        String content = arg0.getKey();
                        Log.e("content ", content);

                        CurrentLocation currentLoc = arg0
                                .getValue(CurrentLocation.class);
                        Log.e("content loc ", currentLoc.toString());

                        userLocations.add(currentLoc);

                        LatLng latLng = new LatLng(currentLoc.getLat(),
                                currentLoc.getLon());

                        Marker marker = mMap.addMarker(new MarkerOptions()
                                .position(latLng)
                                .icon(BitmapDescriptorFactory
                                        .fromResource(R.drawable.ic_launcher_map))
                                .title("Hey there!"));

                    }

                    @Override
                    public void onCancelled(FirebaseError arg0) {

                    }
                });
            }

            @Override
            public void onCancelled(FirebaseError arg0) {
                // TODO Auto-generated method stub

            }
        });

    }
我试图通过使用query.keepSynced()和启用数据持久性(它确实有效)使应用程序看起来更快,但我一直认为这是一种解决方法,在这种情况下,最好是将数据平坦化。问题是,我不认为它是如此嵌套,以至于执行操作所需的时间不会超过2秒,特别是在只有4个用户的情况下


谢谢

嵌套在他们的官方文档中没有任何延迟(直到我看到:D)嵌套绝对不会给您任何延迟(除了一个明显的事实,即如果您加载整个上层,您可能会获取大量数据)。你应该用你正在使用的代码编辑你的问题,这样人们才能更好地帮助你。@Marcelo你说得对,我在我的帖子中添加了查询结构的方法!作为比较,我们的应用程序的数据结构类似,我们可以在大约0.2秒内查询并返回1000个节点;这几乎是瞬间的。在代码示例中,代码似乎在相同的数据上“双重倾斜”。。。不是所有的用户节点都将通过初始查询返回,使得query2读回已经读取的数据吗?在查询中,arg0 key是key,value是currentLocation和coords的子节点?是的,我对Firebase Android API有点新鲜,我可能在做一些愚蠢的事情:因为每个用户都有一个由Firebase自动生成的唯一id,我首先获取他们唯一的ID,然后在获取每个密钥后查询每个用户的位置。必须有更好的方法来做,我现在还不知道然而,我有一个更新:今天它突然开始毫无理由地工作得更快:我没有改变我的应用程序或Firebase结构中的任何东西,它几乎快了20倍。挠头,这个。