首页 > 解决方案 > wanting to fetch firestore like realTimeDatabase

问题描述

is there any way in Firestore to get List of Data in single array ,, for example ..in RealTimeDatabase we get Data array by calling single value instead of using ForEachLoop...for Example in realtimeDatabase we get value by

var PersonObjArrays  : [Person] = [ ] () 

  Database.database().
  reference.child("personFullname").observe( .childAdded.  
   , with : { (snapshot) in 

 let snapShotValue = snapshot.value

 let firstname = snapShotValue["firstname"] as! String
 let lastname = snapShotValue["lastname"] as! String

 let personObj = Person( firstname ,lastname)

 self.messageArray.append(personObj)

but in Firestore we have to used ForLoop .....For Example in Firestore we used

 FireStore.firestore()
  .collection("personFullname").
   getDocuments { (snapshot , error ) in 

          for document in snaphot.document {      

                 let data = document.data( )
                 let firstName = data["firstname"] as! String
                 let lastnamNname = data["lastname"] as! String

                let personObj2 = Person( firstName , lastName)
               self.messageArray.append(personObj2)
 }

So is there any way to get Data of Firestore as whole ObjectArray

标签: swiftalgorithmfirebasefirebase-realtime-databasegoogle-cloud-firestore

解决方案


Firebase 实时数据库始终返回DataSnapshot. 即使保证结果是一个列表,您也会返回 a DataSnapshot,其中每个子节点都是该列表中的一个元素。

Cloud Firestore 针对单个结果和结果列表返回不同的类型。对于单个结果,Firestore 返回 aDocumentSnapshot或 a QueryDocumentSnapshot,它允许您获取单个文档的值(和元数据)。对于查询或集合,Firestore 返回一个QuerySnapshot,其中包含/对象的列表DocumentSnapshotQueryDocumentSnapshot

无法.childAdded从 Cloud Firestore 请求等效项。这是 API 设计人员有意进行的更改,因为许多开发人员混淆了 aDataSnapshot在结果中可能具有的两个角色。

在 RTDB 术语中,Firestore 总是触发一个.value事件,您必须循环遍历结果。如果您循环QuerySnapshot.docChanges仅检查type= addedin,QueryDocumentSnapshot.status您将拥有相当于实时数据库的.childAdded.


所以相当于你的.childAdded听众是这样的:

FireStore.firestore()
  .collection("personFullname")
  .getDocuments { (snapshot , error ) in 
    guard let snapshot = querySnapshot else {
        print("Error fetching snapshots: \(error!)")
        return
    }
    snapshot.documentChanges.forEach { diff in
        if (diff.type == .added) {
            let data = diff.document.data( )
            let firstName = data["firstname"] as! String
            let lastnamNname = data["lastname"] as! String

            let personObj2 = Person( firstName , lastName)
            self.messageArray.append(personObj2)
        }
    }
  })

这一切都基于文档中的这一部分,因此我强烈建议您研究一下。


推荐阅读