Android - 无法从Firebase检索数据

时间:2017-10-25 08:24:33

标签: android firebase firebase-realtime-database

我在两个标记之间画一条路线,我想保存那条路线。为此,我将包含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字符串"学校"是学校的名称,routeIdpush()键,其中的分数是航路点的ArrayList

我的数据库:

database structure

我的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

我不知道为什么。

2 个答案:

答案 0 :(得分:1)

您的代码几乎是正确的,但我认为这样可以节省数据并将其降低。从数据库加载数据时,您将数据编组到Route实例中:

Route route = dataSnapshot.getValue(Route.class);

这将使每个子项下的locations节点与您的POJO类中的setLocations(ArrayList<Location>)匹配。相反,它检索的数据是ArrayList直接。

保存位置列表时,您需要安排结构,以便将位置列表存储在$schoolName/routes/$routeId/locations下:

database structure

因此,在保存路线点数据时,您需要执行以下操作:

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");