如何对Firestore返回的DocumentSnapshot按name字段进行分组
问题原因
你的代码存在一处变量引用错误:
ArrayList<DocumentSnapshot> arrayList = snapshotMap.get ("name");
这里你把Map的查询键写死成了固定字符串"name",而不是使用你从文档中解析得到的动态name变量。这就导致每次循环都无法正确获取到对应name下已有的列表,只会得到null、每次都新建空列表,最终put的时候才用正确的name作为键,所以每个name对应的列表永远只会保留最近一次添加的元素。
修正方案
把上述代码行修改为使用动态name变量查询即可:
private Map<String, ArrayList<DocumentSnapshot>> snapshotMap = new HashMap<> (); userRef.addSnapshotListener (new EventListener<QuerySnapshot> () { @Override public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) { if (value!=null && !value.isEmpty ()) { // 可选:如果需要每次获取全量最新数据、避免重复累加,先清空原有Map // snapshotMap.clear(); for (int i = 0; i < value.size (); i++) { DocumentSnapshot d = value.getDocuments ().get (i); String name = d.get ("name").toString (); // 修改点:用动态name变量查询已有的列表,不是固定字符串"name" ArrayList<DocumentSnapshot> arrayList = snapshotMap.get (name); if (arrayList==null) arrayList = new ArrayList<> (); else Log.e ("tag13", "arraylist size= "+arrayList.size ()); arrayList.add (d); Log.e ("tag13", "new arraylist size = "+arrayList.size ()); snapshotMap.put (name, arrayList); } int x = snapshotMap.get ("Akhil").size (); int y = snapshotMap.get ("name2").size (); Log.e ("tag14", "x = "+ x); Log.e ("tag14", "y = "+ y); } } });
额外注意点
Firestore的快照监听器会在数据变更时多次触发,如果你的需求是每次都拿到最新的全量数据统计,建议在遍历查询结果前先调用snapshotMap.clear()清空旧数据,避免多次触发的结果累加导致列表长度不符合预期。
内容的提问来源于stack exchange,提问作者AKHIL V S
相关产品推荐
相关产品推荐

