无法转换“ QuerySnapshot”类型的值?到预期的参数类型“ DataSnapshot”

时间:2019-10-02 14:34:53

标签: ios swift firebase google-cloud-firestore

我正在尝试将我的应用程序从Realtime DB转换为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转换为DataSnapshot的最佳方法是什么?或者最好先执行for循环,然后将其附加到数组中?

2 个答案:

答案 0 :(得分:1)

问题是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是查询返回的内容,其中包含DocumentSnapshots。您通常会枚举它以获得单个文档

  

一个FIRQuerySnapshot包含零个或多个FIRDocumentSnapshot对象。   可以在documentSet.documents中使用…枚举其大小   可以使用isEmpty和count检查。

简而言之,通过调用'.documents'从Firestore返回的数据将在QuerySnapshot中返回,可以对其进行迭代以获取单个DocumentSnapshots。

另一方面,RTDB中的所有内容都是DataSnapshot,父节点,子节点等。

答案 1 :(得分:0)

通过展开QuerySnapshot,您将更接近于投射吗?我通常使用

guard let snap = snapshot else {return}

您是否有理由无法将DataSnapshots的全局数组声明为QuerySnapshots?我认为DataSnapshots对于实时数据库是唯一的。