Firestore iOS - 删除UITableview中的功能



我正在尝试使用滑动删除功能从 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)")
}
})
}
}

当我滑动并点击"删除"按钮时。出现此错误

由于

未捕获的异常"FIRInvalidArgumentException"而终止应用程序,原因:"无效的文档引用。 文档引用必须具有偶数个段,但 有 1'

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

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

这里还有什么是"sourse"模型。

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

最新更新