Google cloud firestore 从Firestore获取多个数据

Google cloud firestore 从Firestore获取多个数据,google-cloud-firestore,hashmap,singleton,Google Cloud Firestore,Hashmap,Singleton,上面是我在Firestore中的数据库。可以看到,有2个字符串和2个(或更多)数组作为字段 我将获取数据,将其转换为不同的图形 例如:1。显示所有用户所有章节总和的图表 2.显示所有用户“第1章”总和的图表。 3.显示所有章节平均值的图表等 根据用户的选择,这些图表将在不同的活动中显示,并针对该活动进行计算 现在我的问题是如何访问这些数据并将其用于各种活动 我已经尝试使用HashMap>分别存储phonenumb、chapter(x)和chapter(x)的值 以下是访问数据的代码: Colle

上面是我在Firestore中的数据库。可以看到,有2个字符串和2个(或更多)数组作为字段

我将获取数据,将其转换为不同的图形 例如:1。显示所有用户所有章节总和的图表 2.显示所有用户“第1章”总和的图表。 3.显示所有章节平均值的图表等

根据用户的选择,这些图表将在不同的活动中显示,并针对该活动进行计算

现在我的问题是如何访问这些数据并将其用于各种活动

我已经尝试使用HashMap>分别存储phonenumb、chapter(x)和chapter(x)的值

以下是访问数据的代码:

CollectionReference chemistry = db.collection("RESULTS").document("Summary").collection("ChemistryVII");
                chemistry
                        .whereEqualTo("school", "Test School")
                        .get()
                        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                            @Override
                            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                for (DocumentSnapshot document : task.getResult()) {
                                    Map<String, Object> map = document.getData();
                                    for (Map.Entry<String, Object> entry : map.entrySet()) {
                                        if (entry.getKey().contains("chapter")) {
                                            if (outer.isEmpty() || !outer.containsKey(map.get("phonenumb"))) {
                                                Map<String, Object> inner = new HashMap<>();
                                                inner.put(entry.getKey(), entry.getValue());
                                                String phonenumb = map.get("phonenumb").toString();
                                                outer.put(phonenumb, inner);
                                            } else {
                                                Map<String, Object> inner = new HashMap<>();
                                                inner.put(entry.getKey(), entry.getValue());
                                                String phonenumb = map.get("phonenumb").toString();
                                                outer.put(phonenumb, inner);
                                            }

                                        }
                                    }
                                }
                                //Toast("Outer Details  " + outer);
                                schoolGraph();
                            }
                        });
CollectionReference chemistry=db.收集(“结果”).文件(“摘要”).收集(“化学VII”);
化学
.whereEqualTo(“学校”、“测试学校”)
.get()
.addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
对于(DocumentSnapshot文档:task.getResult()){
Map=document.getData();
对于(Map.Entry:Map.entrySet()){
if(entry.getKey()包含(“章节”)){
if(outer.isEmpty()| |!outer.containsKey(map.get(“phonenumb”)){
Map inner=新的HashMap();
inner.put(entry.getKey(),entry.getValue());
字符串phonenumb=map.get(“phonenumb”).toString();
外部。放置(phonenumb,内部);
}否则{
Map inner=新的HashMap();
inner.put(entry.getKey(),entry.getValue());
字符串phonenumb=map.get(“phonenumb”).toString();
外部。放置(phonenumb,内部);
}
}
}
}
//吐司(“外部细节”+外部);
schoolGraph();
}
});
但是,这将不起作用,因为给定键(phonenumb)可能有多个条目


试图了解访问此类数据并将其用于多个活动的最佳方式。

哈希映射键是唯一的。每次添加具有相同键的新对象时,具有相同键的旧值将被覆盖

我认为这部分的逻辑是正确的:

if (outer.isEmpty() || !outer.containsKey(map.get("phonenumb"))) {
    Map<String, Object> inner = new HashMap<>();
    inner.put(entry.getKey(), entry.getValue());
    String phonenumb = map.get("phonenumb").toString();
    outer.put(phonenumb, inner);
您不需要
outer.put(phonenumb,inner),因为内部已存在,并且具有章节的总和

在这里,外部有键“phonenumber”,您只需在内部映射中插入新条目sum:
internal[chapter]=sum


您需要类似于
outert[phonenumb][chapter]=sum的东西

phonenumb是学生的还是学校的?您说将有多个条目具有相同的电话号码。你能举第二个例子吗?Hi Philip,phonenumb是学生的。为了回答下一个问题,当学生尝试多个章节时,数据库将为每个学生提供多个数组。例如,第1章=[10,5,5,7,7,8],第2章=[10,5,5,7,7,8],第3章=[5,6,4,3,6,7]等等。因此,虽然内部地图将有k:Chapter1,v:[10,5,5,7,7,8];k:Chapter2,v:[10,5,5,7,7,8]等,外部映射键将重复phonenumb(k:5100351003);因此,我们正在寻找这个问题的替代解决方案。
Map<String, Object> inner = new HashMap<>();
inner.put(entry.getKey(), entry.getValue());
String phonenumb = map.get("phonenumb").toString();
outer.put(phonenumb, inner);