我正在尝试将我的应用程序从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循环,然后将其附加到数组中?
答案 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对于实时数据库是唯一的。