【问题标题】:Retrieve firebase data in the same order as its added以与添加的顺序相同的顺序检索 Firebase 数据
【发布时间】:2016-05-03 23:09:30
【问题描述】:

如何按照添加的顺序检索 Firebase 列表。 看起来我是按随机顺序获取它们的。我需要它们才能以正确的顺序绘制我的折线。

List<LatLng> latLngList = new ArrayList<>();
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot snapshot) {
        for (DataSnapshot direction : snapshot.getChildren()) {
            if (direction.getKey().equals(firebaseKey)) {
                MyLatLng wantedDirection = direction.getValue(MyLatLng.class);
                for (Waypoints waypoint : wantedDirection.getWaypoints().values()) {
                    double lat = waypoint.getLatitude();
                    double lang = waypoint.getLongitude();
                    LatLng latLng = new LatLng(lat, lang);
                    latLngList.add(latLng);
             }

我希望 JSON 文件的顺序与将条目添加到 firebase 列表中的顺序相同:

{
  "timeStamp" : "2016-05-03 23:06:05",
  "waypoints" : {
    "-KGsf4xB_rZbsAMW4I2D" : {
      "latitude" : 58.338713,
      "longitude" : 11.90885
    },
    "-KGsf5M9YtZn6Yq22Kts" : {
      "latitude" : 58.339218,
      "longitude" : 11.910351
    },
    "-KGsf5qSV3X7cAIBtANF" : {
      "latitude" : 58.340572,
      "longitude" : 11.915417
    },
    "-KGsf6oww79POAY_e7kf" : {
      "latitude" : 58.342271,
      "longitude" : 11.921562
    },
    "-KGsf7JBaac5o7VMEZMh" : {
      "latitude" : 58.344006,
      "longitude" : 11.926909
    },
    "-KGsf7nGpMEgPA0j1rRl" : {
      "latitude" : 58.345594,
      "longitude" : 11.929302
    },
    "-KGsf8HjFtn7Dxpx-DpO" : {
      "latitude" : 58.347846,
      "longitude" : 11.931577
    },
    "-KGsf8ltvEBeqXE_me8Z" : {
      "latitude" : 58.350397,
      "longitude" : 11.932334
    }
  }
}

【问题讨论】:

  • 我建议为每个航路点存储一个时间戳,或者像 Nik 提到的那样存储一个订单密钥。

标签: android firebase firebase-realtime-database


【解决方案1】:

DataSnapshot.getChildren() 将按照您从数据库中查询的顺序返回孩子。如果您没有明确指定 orderByChild()orderByPriority(),则该顺序将是键,这意味着它们将按照插入的顺序进行迭代。

但对于航路点,您正在定义自己的顺序:

for (Waypoints waypoint : wantedDirection.getWaypoints().values()

Mapvalues() 不会按照特定的顺序排列。

更新

要查看从 Firebase 检索项目的顺序,您可以遍历 DataSnapshot

public void onDataChange(DataSnapshot snapshot) {
  for (DataSnapshot direction: snapshot.getChildren()) {
    DataSnapshot waypoints = direction.child("waypoints");
    for (Waypoints waypoint: waypoints.getChildren()) {
        double lat = waypoint.child("latitude").getValue(Double.class);
        double lon = waypoint.child("longitude").getValue(Double.class);
        LatLng latLng = new LatLng(lat, long);
        latLngList.add(latLng);
    }
}

或者,您可以查找按其键的顺序返回其条目的映射。

【讨论】:

    【解决方案2】:

    这对我有用:

     for (Map.Entry<String, Waypoints> waypoint : wantedDirection.getWaypoints().entrySet()) {
                            String key = waypoint.getKey();
                            Waypoints value = waypoint.getValue();
    
                            double lat = value.getLatitude();
                            double lang = value.getLongitude();
                            LatLng latLng = new LatLng(lat, lang);
                            latLngRealList.add(latLng);
                        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2015-07-03
      • 2021-04-20
      • 1970-01-01
      相关资源
      最近更新 更多