Android - 使用push()插入多个标记

时间:2017-10-31 16:08:32

标签: android firebase firebase-realtime-database

我可以在地图上插入多个标记。但是当我插入Firebase数据库时,它只是插入的最后一个标记。我想我必须使用somekind of list或hashmap。

POJO课程:

public class FirebaseMarker {

  String address;
  String time;
  double latitude;
  double longitude;
  String routeId;

  public FirebaseMarker() {
  }

  public FirebaseMarker(String address, String time, double latitude, double longitude, String routerId) {
      this.address = address;
      this.time = time;
      this.latitude = latitude;
      this.longitude = longitude;
      this.routeId = routerId;
  }

  public String getRouterId() {
    return routeId;
  }

  public void setRouterId(String routerId) {
    this.routeId = routerId;
  }

  public String getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  public String getTime() {
    return time;
  }

  public void setTime(String time) {
    this.time = time;
  }

  public double getLatitude() {
    return latitude;
  }

  public void setLatitude(double latitude) {
    this.latitude = latitude;
  }

  public double getLongitude() {
    return longitude;
  }

  public void setLongitude(double longitude) {
    this.longitude = longitude;
  }
}

标记创建:

List<Marker> markers;
markers = new ArrayList<>();

Marker marker =  mMap.addMarker(new MarkerOptions()
                 .position(latLng)
                 .title(address)
                 .snppet(time)
                 .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)));

 markers.add(marker);

我如何插入:

//FirebaseMarker marker = new FirebaseMarker(address, time, latitude, longitude, routeId); 

 markerId = userRef.push().getKey();
userRef.child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(markers);

参数来自userinput和geo-coder

enter image description here

3 个答案:

答案 0 :(得分:1)

要解决此问题,您需要为每次插入指定唯一标识符。由于Firebase数据库是NoSQL数据库,并且构造为键和值对,因此每个节点都是Map,这意味着在Map的情况下,它将旧值替换为新值。所以,你需要改变这行代码:

userRef.child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(marker);

userRef.push().child(sharedPreferences.getString("school",null)).child("markers").child(markerId).setValue(marker);

正如您可能看到的那样,我已在push()之后添加了userRef方法。如果您需要将该按键放在另一个位置,只需将该方法移动到正确的位置即可。

修改:要更新Firebase数据库中的节点,您需要使用updateChildren()方法代替setValue(),如下所示:

markerId = userRef.push().getKey();
Map<String, Object> map = new HashMap<>();
map.put(markerId, marker);
userRef.child(sharedPreferences.getString("school",null)).child("markers").updateChildren(map);

答案 1 :(得分:1)

FirebaseMarker marker = new FirebaseMarker(address, time, latitude, 
longitude, routeId); 

DatabaseReference userRef=FirebaseDatabase.getInstance().getReference().child("sharedPreferences.getString("school",null)").child("markers").push().setValue(marker);

答案 2 :(得分:1)

看起来您有将标记保存到数据库的一般前提,但是您需要先将每个标记存储在内存中,以便以后能够将它们保存到数据库中。

为此,您可以使用HashMap来简化保存:

HashMap<String, Object> markers = new HashMap<>();

public void createMarker(String routeId, LatLng latLng, String address, String time) {    
    // Create a unique ID for this marker (but don't actually store it yet)
    String markerId = schoolReference.child("markers").push().getKey();

    // Add the marker to the HashMap
    FirebaseMarker marker = new FirebaseMarker(address, time, latLng.getLatitude(), latLng.getLongitude(), routeId);
    markers.put(markerId, marker);

    // Add an actual map marker to the map
    mMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title(address)
        .snppet(time)
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))
    );
}

在此示例中,当您创建标记时(在createMarker()方法中),您在向地图实际添加标记之前执行了3个其他操作:

  • 使用push()(不与数据库联系)为此标记生成唯一ID
  • 创建一个可以在以后使用的FirebaseMarker实例
  • 将此唯一ID和FirebaseMarker对添加到HashMap

然后,当您想将这些保存到数据库时,只需将整个HashMapperforming a multi-location update using updateChildren()推送到数据库:

public void saveToDatabase() {
    // Do your thing to save the route

    // Save the markers to the database in one write operation
    schoolReference.child("markers").updateChildren(markers);
}