Firestore查询子集合报Invalid collection reference奇数段错误求助
问题排查与解决方案
错误原因
Firestore规定集合引用的路径段数必须为奇数,文档引用必须为偶数,触发这个报错有两个核心原因:
- 变量初始化时机错误
你将query和FirestoreRecyclerOptions定义为Fragment的成员变量,实例创建时就会初始化,此时day、month、year还都是空值,甚至currentBoss、currentNumber这类全局变量可能也未完成赋值,生成的路径非法。 - 缺少目标集合的获取方法
你要访问的initial stock是Begining文档下的子集合,但你贴出的FirebaseCalls类只封装到了Begining文档的引用,没有实现获取它下层initial stock集合的方法,路径没有走到目标集合,段数不符合要求。
修复步骤
1. 补充Firebase操作方法
在FirebaseCalls类中添加获取目标集合的方法:
// 补充到FirebaseCalls类中 public static CollectionReference getInitialStockCollectionReference(String day, String month, String year) { // 先获取Begining文档引用,再取其下的initial stock集合 return getCommencementDocumentReference(day, month, year).collection("initial stock"); }
2. 调整查询初始化时机
把query和options的初始化逻辑移到configureRecyclerView方法内,确保day、month、year已经完成赋值后再生成查询:
private void configureRecyclerView(View view) { RecyclerView recyclerView = view.findViewById(R.id.khat_debut_recyclerview); // 在此处初始化查询,确保日期参数已赋值 Query query = getInitialStockCollectionReference(day, month, year).orderBy("typ", Query.Direction.ASCENDING); FirestoreRecyclerOptions<Khat> options = new FirestoreRecyclerOptions.Builder<Khat>() .setQuery(query, Khat.class).setLifecycleOwner(this).build(); KhatDebutAdapter adapter = new KhatDebutAdapter(options); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); }
3. 额外校验项
- 确认
currentBoss、currentNumber全局变量在Fragment创建前已经完成赋值,无空值问题 - 确认路径中所有集合、文档名称拼写完全匹配,比如
Begining是否拼写正确、initial stock的空格是否一致
内容的提问来源于stack exchange,提问作者fathi93
相关产品推荐
相关产品推荐

