You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:49:42