Android Java读取Firestore purchases数组下嵌套products数据方案(无自定义类)
Firestore 深层嵌套数组/对象读取方案(无自定义类实现)
Firestore Android SDK 读取数据时会自动做原生类型映射:
- 文档中的数组类型默认返回
List<?>实例 - 文档中的对象类型默认返回
Map<String, Object>实例
不需要定义任何自定义类,按照这个映射规则逐层强转遍历,就能拿到任意深度的嵌套数据。
可直接运行的实现代码
替换原有监听逻辑即可,核心是去掉冗余的全键遍历,逐层做类型转换:
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { DocumentSnapshot document = task.getResult(); if (document.exists()) { Map<String, Object> data = (Map<String, Object>) document.getData().get("path"); // 1. 取出purchases数组,强转为List List<Map<String, Object>> purchasesList = (List<Map<String, Object>>) data.get("purchases"); if (purchasesList == null) { Log.d(TAG, "purchases字段为空"); return; } // 2. 遍历purchases数组的每一项 for (int index = 0; index < purchasesList.size(); index++) { Map<String, Object> purchaseItem = purchasesList.get(index); // 3. 取出当前项里的products嵌套对象,强转为Map Map<String, Object> productsMap = (Map<String, Object>) purchaseItem.get("products"); if (productsMap == null) continue; // 4. 遍历products下的所有字段 for (Map.Entry<String, Object> entry : productsMap.entrySet()) { String fieldKey = entry.getKey(); Object fieldValue = entry.getValue(); Log.d(TAG, "第" + index + "条purchase的products字段:" + fieldKey + " = " + fieldValue); // 如果fieldValue本身还是数组/对象,继续按List/Map规则强转遍历即可 } } } else { Log.d(TAG, "No such document"); } } else { Log.d(TAG, "get failed with ", task.getException()); } } });
注意事项
- 如果线上数据结构可能存在异常,建议在强转前增加
instanceof类型校验,避免抛出ClassCastException - 嵌套层级再多也可以用同样的逻辑处理,不需要引入额外的序列化库或者自定义类
- 原有遍历整个data的keySet找purchases字段的逻辑属于冗余操作,直接调用
data.get("purchases")即可取值,性能更好
对应存储结构参考

内容的提问来源于stack exchange,提问作者Sana
相关产品推荐
相关产品推荐

