首页 > 解决方案 > 如何从 Firestore 获取数组内的地图值?

问题描述

在此处输入图像描述

我将上述数据结构存储在 Cloud Firestore 中。我想保存车队,这是一组地图,其中“id”和“name”存储在 Firestore 中。我很难获取数据并将其存储为数组。我只能得到一个奇怪的字符串,但是有什么方法可以存储为字符串数组吗?下面是我使用的代码。

public void getFleets() {

    DocumentReference document = mDb
            .collection(FirestoreService.CLIENT_COLLECTION)
            .document(new SessionService(getApplicationContext()).getClientUID());

    document.get()
            .addOnCompleteListener(task -> {
                if (task.isSuccessful() && task.getResult() != null) {
                    DocumentSnapshot doc = task.getResult();
                    List<String> group = (List<String>) doc.get("fleets");
                    Log.i(TAG, "getFleets: " + group);

                } else
                    Log.d(TAG, "Error getting documents: ", task.getException());
            });
}

这是数组结果:

[{name=Caminhão, id=1}, {name=Escavadeira, id=2}, {name=Carregadeira, id=3}, {name=Trator, id=4}]

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


正如你所说,你的fleets领域是一组地图。您在调试输出中看到的正是我所期望的。注意外面的方括号表示一个java List 类型的对象,里面的花括号表示里面的java Map 类型的对象。但是,您的泛型类型是错误的。而不是List<String>,您应该使用List<Map<String, Object>>来说明 List 中的 Map 对象。

如果你想要一个List<String>,你将不得不编写一些代码来从 Map 中提取所需的字符串并使用该值构建一个新的 List。因此,如果您希望name每个地图项都具有该属性,则可以执行以下操作:

List<Map<String, Object>> groups = (List<Map<String, Object>>) doc.get("fleets");
ArrayList<String> names = new ArrayList<>();
for (Map<String, Object> group : groups) {
    String name = group.get("name");
    names.add(name);
}

现在,您从列表中的地图中获得了一个名称列表。


推荐阅读