Java 如果我想要快速更新,三级嵌套对Firebase来说是否太多了?
我要做的是查询所有用户的当前位置,以便将他们放在地图上。不幸的是,即使我目前只有四个测试用户,返回结果也需要相当长的时间(有时长达10秒)。这真的是一个需要平整的结构吗 这是我用来获取每个用户的CurrentLocation实例的Java代码: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
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倍。挠头,这个。