gpt4 book ai didi

ios - Firestore iOS - UITableview 中的删除功能

转载 作者:行者123 更新时间:2023-11-28 14:36:26 24 4
gpt4 key购买 nike

我正在尝试使用滑动删除功能从 Firestore 中删除一个在我的 UITableView 上显示为 UITableViewCell 的文档。

 var sourseArray : [Sourse] = []

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
let sourseItem = sourseArray[indexPath.row]
Firestore.firestore().collection("sourses").document(sourseItem.documentId).delete(completion: { (error) in
if let error = error {
debugPrint("Could not delete thought: \(error.localizedDescription)")
}
})
}
}

当我滑动并点击“删除”按钮时。出现这个错误

*** Terminating app due to uncaught exception 'FIRInvalidArgumentException', reason: 'Invalid document reference. Document references must have an even number of segments, but sourses has 1'

我调整了 Firestore 数据库的“规则”以允许删除。

经过一些研究,我似乎没有以某种方式引用正确的文档。这是错误的引用还是其他错误?

这也是“来源”模型的定义。

class Sourse {
private(set) var name: String!
private(set) var content: String!
private(set) var timeStamp: Date!
private(set) var documentId: String!
private(set) var userId: String!

init(name: String, timeStamp: Date, content: String, documentId: String, userId: String) {
self.name = name
self.content = content
self.timeStamp = timeStamp
self.documentId = documentId
self.userId = userId
}
}

//编辑

我刚刚注意到我在创建新源时没有添加 documentId。如下所示。

@IBAction func addSourse(_ sender: Any) {
Firestore.firestore().collection(SOURSES_REF).addDocument(data: [
NAME : sourseTextField.text ?? "",
CONTENT : contentTextField.text ?? "",
TIMESTAMP : FieldValue.serverTimestamp(),
USERNAME : Auth.auth().currentUser?.displayName ?? "",
USER_ID : Auth.auth().currentUser?.uid ?? ""

]) { (err) in
if let err = err {
debugPrint("Error adding document document: \(err)")
} else {
self.navigationController?.popViewController(animated: true)
}
}
}

然而,这也是我教程中的方式,并且效果很好。

///编辑 2 来展示我是如何获取它的。

 func loadData() {
db.collection("sourses").getDocuments() { (snapshot, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let snapshot = snapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
let content = data["content"] as? String ?? ""
let timeStamp = data["timeStamp"] as? Date ?? Date()
let documentId = data["documentId"] as? String ?? ""
let userId = data["userId"] as? String ?? ""
let newSourse = Sourse(name:name, timeStamp: timeStamp, content:content, documentId: documentId, userId: userId)
self.sourseArray.append(newSourse)

DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
}
}

答:滑动删除功能一直是正确的。正如 Dopapp 所指出的,我错误地加载了我的 document.Id。

最佳答案

如果问题确实是您的 documentId 错误,您可能没有正确检索它。以下是如何使用正确的 ID 创建对象的快速示例:

collection.addSnapshotListener { (snapshot, error) in
if let documents = snapshot?.documents {
for document in documents {
guard let data = document.data() else { continue }
let id = document.documentID
let sourseItem = Sourse(name: data['name'], ..., documentId: id, ...)
// use sourseItem
}
}
}

如果您正在做类似的事情,我会检查文档 ID 是否在对象之间交换。如果是这样,则可能表明存在与异步相关的问题。

对于您的特定情况,loadData() 应如下所示:

func loadData() {
db.collection("sourses").getDocuments() { (snapshot, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let snapshot = snapshot {
for document in snapshot.documents {
let data = document.data()
let name = data["name"] as? String ?? ""
let content = data["content"] as? String ?? ""
let timeStamp = data["timeStamp"] as? Date ?? Date()
let documentId = document.documentID
let userId = data["userId"] as? String ?? ""
let newSourse = Sourse(name:name, timeStamp: timeStamp, content:content, documentId: documentId, userId: userId)
self.sourseArray.append(newSourse)

DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
}
}

关于ios - Firestore iOS - UITableview 中的删除功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50867152/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com