我可以在地图上插入多个标记。但是当我插入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
答案 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
实例FirebaseMarker
对添加到HashMap
然后,当您想将这些保存到数据库时,只需将整个HashMap
按performing 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);
}