我正在使用FirebaseFirestore作为我的数据库。
我有一系列名称和描述的列表。我还想抓住每个列表中唯一的documentId。这可能吗?
List.swift
struct List {
var name:String
var description:String
var dictionary:[String:Any] {
return [
"name":name,
"description":description
]
}
}
ListTableViewController.swift
func getLists() {
if Auth.auth().currentUser != nil {
db.collection("lists").getDocuments { (querySnapshot, error) in
if let error = error {
print("Error getting documents: \(error)")
} else {
self.listArray = querySnapshot!.documents.flatMap({List(dictionary: $0.data())})
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
}
我发现你可以通过......来获取documentId。
for document in querySnapshot!.documents {
print("\(document.documentID) => \(document.data())")
}
但是如何将其存储在我的列表中以便以后调用?
答案 0 :(得分:5)
1.假设您正在快照中获取文档。
guard let documents = ducomentSnapshot?.documents else {
print("Error fetching documents: \(error!)")
return
}
//使用此代码获取每个文档对象的documentId。
for i in 0 ..< documents.count {
let dictData = documents[i].data()
let documentID = documents[i].documentID
print("Document ID \(documentID)")
}
答案 1 :(得分:1)
如果这是最好的方式,我不是肯定的,但我附加到listArray,它似乎有效。
self.listArray.append(List(name: document["name"] as! String, description: document["description"] as! String, documentId: document.documentID))
答案 2 :(得分:0)
向您的列表结构添加id属性:
struct List {
var name:String
var description:String
var id: String?
var dictionary:[String:Any] {
return [
"name":name,
"description":description
]
}
}
然后在映射文档时手动分配id属性:
list = documents.compactMap{ (queryDocumentSnapshot) -> List? in
var listItem = try? queryDocumentSnapshot.data(as: List.self)
listItem?.id = queryDocumentSnapshot.documentID
return listItem
}