Firebase Cloud Firestore:偶数段路径集合获取失败,求助分类获取方法
咱们先拆解下你遇到的两个问题,再给出针对性的解决办法:
第一个报错的原因
你第一次用firestore.collection("shop/warehouse")触发错误,是因为Firestore对集合引用的路径有严格要求:集合路径的段数必须是奇数。而shop/warehouse是两段(shop是根集合,warehouse是该集合下的文档),属于文档引用,不是集合,所以不能用collection()方法调用。
第二个代码拿不到数据的原因
你改成firestore.collection("shop/").document("warehouse")后,读取的是warehouse这个文档本身的数据,但你的分类(cat1、cat2)是存在warehouse文档的**子集合categories**里,不是warehouse文档的字段,所以documentSnapshot.getData()返回空——你读错了对象,应该读子集合而非文档。
正确的实现代码
根据你描述的结构Shop > warehouse > categories > cat1、cat2,正确的做法是访问warehouse文档下的categories子集合,对应的集合路径是shop/warehouse/categories(三段,奇数,符合集合引用要求)。
下面是可以正常获取分类列表的代码:
firestore.collection("shop/warehouse/categories") .addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) { // 先处理异常情况 if (e != null) { Log.d(TAG, "监听分类列表出错: " + e.getMessage()); return; } // 遍历分类集合里的文档 if (queryDocumentSnapshots != null && !queryDocumentSnapshots.isEmpty()) { for (DocumentSnapshot doc : queryDocumentSnapshots) { // doc.getId()就是你要的分类名称(cat1、cat2) String categoryName = doc.getId(); Log.d("获取到的分类", categoryName); // 如果需要获取分类对应的文档内容,可调用doc.getData() Map<String, Object> categoryContent = doc.getData(); if (categoryContent != null) { Log.d("分类对应文档数据", categoryContent.toString()); } } } else { Log.d(TAG, "未找到任何分类数据"); } } });
额外确认点
请你在Firebase控制台核对数据结构是否和预期一致:
shop是根级集合warehouse是shop集合中的文档(不是集合)categories是warehouse文档的子集合cat1、cat2是categories集合中的文档
如果你的实际结构和上述不符(比如warehouse是集合而非文档),可以根据调整后的路径修改代码,但按照你描述的“每个分类包含名称及对应文档”,上面的代码应该完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Sabatino

