我正在尝试将我的应用程序从实时数据库转换为Firestore。我有以下代码:

let db = Firestore.firestore()
var rideRequests: [DataSnapshot] = []

db.collection("RideRequests").getDocuments() { (querySnapshot, err) in
    if let err = err {
        print("Error getting documents: \(err)")
    } else {
        self.rideRequests.append(querySnapshot)
        self.tableView.reloadData()

        for document in querySnapshot!.documents {
            print("\(document.documentID) => \(document.data())")
        }
    }
}

我有一个TableViewController,但是当我试图传递来自查询的响应时,得到以下错误:
无法转换“QuerySnapshot”类型的值到所需的参数类型“DataSnapshot”
将此QuerySnapshot转换为数据快照的最佳方法是什么?还是最好先执行for循环,然后将其附加到数组中?

最佳答案

问题是Firestore没有DataSnapshot。它有一个QuerySnapshot和DocumentSnapshot。因此,您需要开始迁移接收到DataSnapshot的任何代码,以便根据用例接收QuerySnapshot或DocumentSnapshot。
假设您以前这样做是为了获取Firebase实时数据库中的数据,其中一个节点是用.childAdded读取的

func printDataSnapshot(withSnapshot: DataSnapshot) {
   let key = withSnapshot.key
   let name = withSnapshot.childSnapshot("name").value as! String
   print(key, name)
}

在Firestore中,如果一个集合(一组节点)被读入
func printDocumentSnapshot(withQuerySnapshot: QuerySnapshot) {
   for doc in withQuerySnapshot.documents {
      let docId = withDocSnapshot.docId()
      let name = withDocSnapshot.get("name") as! String
      print(docId, name)
   }
}

或者如果您使用ref.getDocument读取单个文档(节点)。。。
func printDocumentSnapshot(withDocumentSnapshot: DocumentSnapshot) {
    let docId = withDocumentSnapshot.docId()
    let name = withDocumentSnapshot.get("name") as! String
    print(docId, name)
}

QuerySnapshot是从查询返回的内容,它包含文档快照。你一般都会把它列举出来
FIRQuerySnapshot包含零个或多个FIRDocumentSnapshot对象。
它可以在documentSet.documents及其大小中使用for…枚举
可进行空数检验。
简言之,通过调用“.documents”从Firestore返回的数据将在一个QuerySnapshot中返回,该QuerySnapshot可以被迭代以获取各个文档快照。
另一方面,RTDB中的所有内容都是数据快照、父节点、子节点等。

10-08 03:18