从Cloud Firestore数据库检索数据时出错

时间:2020-08-29 23:26:55

标签: java android firebase google-maps google-cloud-firestore

我向我的Cloud Firestore数据库发送了Map<String, LatLng>。现在,我想以地图的形式检索数据。然后,我想将该Map发送到我的片段,以便该片段可以在Google地图上绘制LatLng。

这就是我所做的:

我成功地从数据库中检索了数据,但是错误出在片段中,我想从地图上获取LatLng。

我如何检索数据: MapsActivity:

Source source = Source.DEFAULT;

pinColRef.get(source)
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                       ArrayList arrayOfPins = new ArrayList<java.util.Map>();
                       arrayOfPins.add(document.getData());
                       Log.i(TAG, document.getData().toString());
                    }
                }
            }
        });

如您所见,我检索数据,然后使用getData()获取发送的地图。 Log.i语句成功将数据库中的数据显示为Map。

因此,我将该数据发送到片段。

这是我的做法:

MapsActivity:

public ArrayList getPinData() {
    return arrayOfPins;
}

片段:

MapsActivity activity = (MapsActivity) getActivity();
ArrayList arrayOfPins = activity.getPinData();

我如何尝试从数据库中绘制LatLng(在Fragment的MapReadyCallback中):

for (java.util.Map ploc : arrayOfPins) {
    LatLng pCoord = ploc.get("Location");
    map.addMarker(new MarkerOptions()
            .position(pCoord)
            .title("Pin"));
}

第一个错误出现在java.util.Map ploc上:

错误:类型不兼容:对象无法转换为Map

然后,另一个错误发生在LatLng pCoord = ploc.get("Location")上。

这是我的Firestore数据库的图片: Database

我认为当您使用getData()时,它将文档的字段作为Map返回。

那么,为什么arrayOfPins中的元素不是Maps

1 个答案:

答案 0 :(得分:1)

我认为当您使用getData()时,它将文档的字段作为Map返回。

实际上,QueryDocumentSnapshot的getData()方法返回一个Map<String, Object>对象。但是,要在Location属性下获取数据,您应该在QueryDocumentSnapshot对象上显式调用.get("Location"),如以下代码行所示:

pinColRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Map<String, Object> map = (HashMap<String, Object>) document.get("Location");
                if (map != null) {
                    Log.d("TAG", map.get("latitude") + ", " + map.get("longitude"));

                    //Add the markers on the map
                }
            }
        } else {
            Log.d(TAG, task.getException().getMessage());
        }
    }
});