Firebase从实时数据库迁移至Cloud Firestore:子节点遍历代码改写问题
解决Firestore遍历文档/字段的编译错误问题
我帮你捋捋这个问题哈——Firebase实时数据库和Cloud Firestore的数据结构差异确实容易在这里踩坑,咱们一步步来改:
先搞清楚核心差异
实时数据库的DataSnapshot是树形结构,用children来遍历子节点;但Firestore的快照分两种:
- QuerySnapshot:查询整个集合返回的结果,包含多个文档
- DocumentSnapshot:单个文档的快照,包含文档里的字段
你的编译错误是因为直接遍历QuerySnapshot本身是不行的,得访问它的documents属性来获取文档列表。
针对集合查询的修改方案(对应你原来遍历子节点的场景)
如果你的snapshot是查询集合得到的QuerySnapshot,把代码改成这样:
if (!snapshot.isEmpty) { // QuerySnapshot用isEmpty判断是否有文档,exists()是单个文档的方法 for (document in snapshot.documents) { FetchInformation(document.id) // Firestore里文档的唯一标识是id,对应实时数据库的key } } else { Log.d(TAG, "Current data: null") }
如果是单个文档要遍历字段
要是你是拿到单个文档的DocumentSnapshot,想遍历它的子字段,就这么写:
if (snapshot.exists()) { val docData = snapshot.data docData?.forEach { (fieldKey, _) -> FetchInformation(fieldKey) } } else { Log.d(TAG, "Current data: null") }
关键注意点
- 实时数据库的
x.key→ Firestore里文档用document.id,字段用fieldKey - QuerySnapshot没有
exists()方法,用isEmpty判断是否有结果;exists()是DocumentSnapshot专属的 - 遍历Firestore的集合文档必须通过
documents属性,它是一个可迭代的文档列表
内容的提问来源于stack exchange,提问作者sykezlol
相关产品推荐
相关产品推荐

