【问题标题】:wanting to fetch firestore like realTimeDatabase想要获取像实时数据库这样的火库
【发布时间】:2020-01-04 15:19:23
【问题描述】:

Firestore 中是否有任何方法可以获取单个数组中的数据列表,例如 ..在 RealTimeDatabase 中,我们通过调用单个值而不是使用 ForEachLoop 来获取数据数组...例如,在 realtimeDatabase 中,我们通过以下方式获取值

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)

但在 Firestore 中我们必须使用 ForLoop .....例如在 Firestore 中我们使用了

 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)
 }

那么有什么方法可以将 Firestore 的数据作为整个 ObjectArray 获取

【问题讨论】:

    标签: swift algorithm firebase firebase-realtime-database google-cloud-firestore


    【解决方案1】:

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

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

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

    在 RTDB 术语中,Firestore 始终会触发 .value 事件,您必须遍历结果。如果你循环 QuerySnapshot.docChanges 只检查 type = addedQueryDocumentSnapshot.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)
            }
        }
      })
    

    这都是基于this section in the documentation,所以我强烈推荐学习。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多