Android中从Firestore获取数据:将QueryDocumentSnapshot列表转为ArrayList
把Firestore的QueryDocumentSnapshot列表转成ArrayList的解决方案
嘿,这事儿不难,我来给你捋清楚怎么把Firestore返回的QueryDocumentSnapshot列表转成你要的ArrayList!
首先,我们需要先定义一个数据模型类,用来和Firestore里的orderedItemsList中的每个条目对应,这样能让数据映射更清晰,避免手动处理Map的麻烦:
public class OrderedItem { private String itemDescription; private String itemId; private String itemImageURL; private String itemPrice; private int itemQuantity; private int itemStatus; private String itemTitle; // Firestore要求必须有空构造函数,用来反序列化数据 public OrderedItem() {} // 可选:带参数的构造函数,方便手动创建对象 public OrderedItem(String itemDescription, String itemId, String itemImageURL, String itemPrice, int itemQuantity, int itemStatus, String itemTitle) { this.itemDescription = itemDescription; this.itemId = itemId; this.itemImageURL = itemImageURL; this.itemPrice = itemPrice; this.itemQuantity = itemQuantity; this.itemStatus = itemStatus; this.itemTitle = itemTitle; } // 必须的Getter和Setter方法,Firestore会通过这些方法来赋值 public String getItemDescription() { return itemDescription; } public void setItemDescription(String itemDescription) { this.itemDescription = itemDescription; } public String getItemId() { return itemId; } public void setItemId(String itemId) { this.itemId = itemId; } public String getItemImageURL() { return itemImageURL; } public void setItemImageURL(String itemImageURL) { this.itemImageURL = itemImageURL; } public String getItemPrice() { return itemPrice; } public void setItemPrice(String itemPrice) { this.itemPrice = itemPrice; } public int getItemQuantity() { return itemQuantity; } public void setItemQuantity(int itemQuantity) { this.itemQuantity = itemQuantity; } public int getItemStatus() { return itemStatus; } public void setItemStatus(int itemStatus) { this.itemStatus = itemStatus; } public String getItemTitle() { return itemTitle; } public void setItemTitle(String itemTitle) { this.itemTitle = itemTitle; } }
接下来,我们有两种方式把QueryDocumentSnapshot列表转成ArrayList:
方式一:用外层模型类自动映射
如果你的Firestore文档结构是外层包含orderedItemsList字段,那可以再定义一个外层类:
public class OrderDocument { private List<OrderedItem> orderedItemsList; public OrderDocument() {} public List<OrderedItem> getOrderedItemsList() { return orderedItemsList; } public void setOrderedItemsList(List<OrderedItem> orderedItemsList) { this.orderedItemsList = orderedItemsList; } }
然后遍历QueryDocumentSnapshot列表,直接转成外层对象,再提取列表:
// 假设你已经获取到了QueryDocumentSnapshot的列表,命名为querySnapshots ArrayList<OrderedItem> allOrderedItems = new ArrayList<>(); for (QueryDocumentSnapshot doc : querySnapshots) { // 把文档转成外层对象 OrderDocument orderDoc = doc.toObject(OrderDocument.class); // 把当前文档里的所有条目添加到总ArrayList中 allOrderedItems.addAll(orderDoc.getOrderedItemsList()); } // 现在allOrderedItems就是你要的ArrayList<OrderedItem>了
方式二:手动处理Map(适合不想定义外层类的情况)
如果不想额外定义外层类,也可以直接从文档中取出orderedItemsList字段,手动转成OrderedItem对象:
ArrayList<OrderedItem> allOrderedItems = new ArrayList<>(); for (QueryDocumentSnapshot doc : querySnapshots) { // 从文档中取出orderedItemsList,转成List<Map> List<Map<String, Object>> itemMaps = (List<Map<String, Object>>) doc.get("orderedItemsList"); // 遍历每个Map,转成OrderedItem对象 for (Map<String, Object> itemMap : itemMaps) { OrderedItem item = new OrderedItem(); item.setItemDescription((String) itemMap.get("itemDescription")); item.setItemId((String) itemMap.get("itemId")); item.setItemImageURL((String) itemMap.get("itemImageURL")); item.setItemPrice((String) itemMap.get("itemPrice")); // 注意:Firestore中存储的数字默认是Long类型,需要转成int item.setItemQuantity(((Long) itemMap.get("itemQuantity")).intValue()); item.setItemStatus(((Long) itemMap.get("itemStatus")).intValue()); item.setItemTitle((String) itemMap.get("itemTitle")); allOrderedItems.add(item); } }
几个要注意的点:
- 空构造函数和Getter/Setter:Firestore的
toObject()方法依赖空构造函数和对应的Getter/Setter来完成数据映射,这俩缺一不可。 - 数字类型转换:Firestore里存储的整数默认是
Long类型,直接转int的时候要注意强转,避免类型转换异常。 - 空值处理:如果某些字段可能为null(比如你的示例里
itemId是null),在赋值的时候要考虑空值情况,避免NullPointerException。
内容的提问来源于stack exchange,提问作者Lich King
相关产品推荐
相关产品推荐

