想要获取像实时数据库这样的火库

Posted

技术标签:

【中文标题】想要获取像实时数据库这样的火库【英文标题】: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 获取

【问题讨论】:

【参考方案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,所以我强烈推荐学习。

【讨论】:

添加了一个例子。但我也强烈建议您学习文档,并在此处为 ios 开发人员学习 Firestore 代码实验室:codelabs.developers.google.com/codelabs/firestore-ios

以上是关于想要获取像实时数据库这样的火库的主要内容,如果未能解决你的问题,请参考以下文章

从 Firebase 实时数据库 Kotlin 中检索有序数据

如何从 Instagram 实时发布数据中获取实际照片?

实时创建新闻提要

实时可扩展聊天应用程序 - 我应该选择哪个数据库?

如何在颤振中以简单的方式从实时数据库中获取数据?

是否有推荐的方法来获取 web 应用程序的实时数据?