【问题标题】:Error retrieving data from Cloud Firestore database从 Cloud Firestore 数据库检索数据时出错
【发布时间】:2020-12-18 12:05:42
【问题描述】:

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

这是我所做的:

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

我如何检索数据: 地图活动:

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。

所以,我将该数据发送到片段。

我是这样做的:

地图活动:

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:

错误:不兼容的类型:对象无法转换为地图

那么,另一个错误是在LatLng pCoord = ploc.get("Location")

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

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

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

【问题讨论】:

  • Firestore 只能在其文档中存储 JSON 数据(或可与 JSON 数据相互转换的 Java 类)。但是,如果不了解您如何存储数据以及它在数据库中的样子,就无法说更多。
  • @FrankvanPuffelen 感谢您的回复。如果我添加一张我的 Cloud Firestore 数据库的图片(来自 firebase 控制台)会有帮助吗?
  • @TanayN 是的,这将非常有帮助。也请回复@。
  • @AlexMamo 我做了更改。希望对您有所帮助!
  • @TanayN 请在下面查看我的答案。

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


【解决方案1】:

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

确实,QueryDocumentSnapshot 的getData() 方法返回一个Map&lt;String, Object&gt; 对象。但是,要获取 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());
        }
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2021-10-26
    • 2021-05-27
    • 1970-01-01
    相关资源
    最近更新 更多