我从Firestore获取数据,并将其保存到Map字符串对象。
数据如下所示:

[auto-generated key]
    fieldname: value
    fieldname: value
...


可以有任意多个字段,可以将它们命名为任何名称并存储数字/文本/时间戳。
我将它们放入这样的地图中:

Map<String, Object> myMap = new HashMap<>();

for (QueryDocumentSnapshot document : task.getResult()) {
    myMap.put(document.getId(), document.getData());
}


我想做什么:
我有一个数据类,我想用这种类型将它们存储在一个列表中。

public class DemoData {
    public String autoId;
    public List<String> fieldNames;
    public List<Object> values;

    public DemoData() {}
}


所以这是我现在拥有的代码:
我可以获得键列表和字段名-值对列表。

List<String> k = new ArrayList<>();
List<Object> v = new ArrayList<>();

for (Map.Entry<String, Object> entry : map.entrySet()) {
    k.add(entry.getKey());
    v.add(entry.getValue());
}


(看起来像):
java - Android,使用给定的类从Map到Object获取值-LMLPHP

我如何在列表“ v”中遍历每个项目的每个字段名/值对,并将它们保存到两个单独的列表中。 (然后从它们中形成DemoData对象)。

因此,DemoData对象将如下所示:

autoId: "YbWQh..."
fieldNames: ["default", "entity_name", "Datum", "fav"...]
values: [false,"Fontos datumok", Timestamp..., false...]

最佳答案

List具有一个接受任何实现Collection接口的数据结构的构造函数。 Map具有在实现Set接口的Collection中一次返回所有键和值的方法。您可以使用它们来获取所需格式的数据。

这应该工作

for(int i = 0; i < v.size(); i++) {
    DemoData demoData = new DemoData();
    demoData.fieldNames = new ArrayList<>(); // line# 1
    demoData.values = new ArrayList<>(); //line# 2
    demoData.autoId = k.get(i).toString();
    HashMap m = v.get(i);
    demoData.fieldNames.addAll(m.keySet());
    demoData.values.addAll(m.values());
}


理想情况下,应该从我的代码中删除第1行和第2行,并将其移到类DemoData的构造函数中。

09-05 00:47