我在两个标记之间画一条路线,我想保存那条路线。为此,我将包含lat和lng的ArrayList
保存在Firebase数据库中。但是我在检索航点时遇到了问题。这是我插入的方式:
String routeId = database.push().getKey();
database.child(sharedPreferences.getString("school", null)).child("routes").child(routeId).setValue(points);
SharedPreferences.Editor editor = getActivity().getSharedPreferences("sh", MODE_PRIVATE).edit();
editor.putString("key", routeId);
editor.commit();
sharedPreferences
字符串"学校"是学校的名称,routeId
是push()
键,其中的分数是航路点的ArrayList
。
我的数据库:
我的POJO课程:
public static class Route {
private ArrayList<Location> locations;
public Route() {
}
public ArrayList<Location> getLocations() {
return locations;
}
public void setLocations(ArrayList<Location> locations) {
this.locations = locations;
}
}
public static class Location {
private Double latitude;
private Double longitude;
public Location() {
}
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;
}
}
检索航点:
points = new ArrayList();
userRef.child(sharedPreferences.getString("school", null)).child("routes").child(sh.getString("key",null)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Route route = dataSnapshot.getValue(Route.class);
for (Location location : route.getLocations()) {
double lat = location.getLatitude();
double lng = location.getLongitude();
position = new LatLng(lat, lng);
points.add(position);
}
}
但我收到了数据库异常:
DatabaseException:无法将java.util.ArrayList类型的对象转换为类型packagename
我不知道为什么。
答案 0 :(得分:1)
您的代码几乎是正确的,但我认为这样可以节省数据并将其降低。从数据库加载数据时,您将数据编组到Route
实例中:
Route route = dataSnapshot.getValue(Route.class);
这将使每个子项下的locations
节点与您的POJO类中的setLocations(ArrayList<Location>)
匹配。相反,它检索的数据是ArrayList
直接。
保存位置列表时,您需要安排结构,以便将位置列表存储在$schoolName/routes/$routeId/locations
下:
因此,在保存路线点数据时,您需要执行以下操作:
database.child(schoolName).child("routes").child(routeId).child("locations").setValue(points);
一种简单的方法可以考虑:如果Route
还有一个名称字段(setName(String)
),那么数据库也可能与$schoolName/routes/$routeId/name
位于locations
的同一位置{1}}值。
或者,在保存到数据库时,您可以将points
变量转换为Route
个实例,然后将其直接推送到$schoolName/routes/$routeId
,这样可以确保它{&#39}。正确存储。
答案 1 :(得分:0)
试试这个
final HashMap<Integer,HashMap<String,Double>> positions = new HashMap<>();
userRef.child(sharedPreferences.getString("school", null)).child("routes").child(sh.getString("key",null)).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int i=0;
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
HashMap<String,Double> position = new HashMap<String, Double>();
position.put("lat",Double.parseDouble(postSnapshot.child("latitude").getValue().toString()));
position.put("lng",Double.parseDouble(postSnapshot.child("longitude").getValue().toString()));
positions.put(i++,position);
}
}
您可以将positions
变量中存储的值作为
positions.get(index).get("lat");
positions.get(index).get("lng");