【发布时间】:2019-11-12 04:43:55
【问题描述】:
当我尝试从 firebase 中的子节点中删除节点时,它会使我的代码崩溃,并给出一个致命错误,即“索引超出范围”。最终结果是从 UID 中删除与 ID 关联的数据。我附上了删除单元格的代码
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if (editingStyle == .delete) {
var listOfUID = [String]()
let ref = Database.database().reference().child(currentEmail!)
ref.observe(.childAdded , with: { snapshot in
if !snapshot.exists() {return}
print(snapshot.key)
let listOfUID = [snapshot.key]
let name = listOfUID[indexPath.row]
ref.queryOrdered(byChild: name ).queryEqual(toValue: name).observe(.childAdded, with: { (snapshot) in
snapshot.ref.removeValue(completionBlock: { (error, reference) in
if error != nil {
print("There has been an error:\(error)")
}
data.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .left)
})
})
})
}
}
let name = listOfUID[indexPath.row - 1]之类的某些原因也无法修复它。
我还认为值得一提的是,当前的电子邮件有一个扫描仪可以取出“。”
我已经上传了数据库的结构是如何设置的
{
"email@yahoocom" : {
"-LtUztWPbQias7bh5C2L" : {
"message" : "Didn’t",
"teamName" : "jah"
},
"-LtUzumEkb2kjK4qeU6E" : {
"message" : "D d",
"teamName" : "did if"
},
"-LtVCbxDu6DqxWv7LHzp" : {
"message" : "Cc’d",
"teamName" : "xdfff"
}
},
"nice@nicecom" : {
"-LtSjXIKnKXKgp-XCzdP" : {
"message" : "Test 2",
"teamName" : "test 1"
}
}
}
【问题讨论】:
-
如果您的问题与 XCode IDE 有关,请仅使用
xcode标记。有关 iOS 编程的一般问题,请使用ios标记。 -
明白了,抱歉 :)
-
该代码存在许多问题会导致它崩溃,更不用说将观察者添加到要删除的节点(?)。我建议重新考虑如何将数据存储在 tableView 数据源中的策略。如果您读取一组 Firebase 节点并将它们保存在一个数组中,那么您当时也将拥有节点键,因此也将它们存储在数据源中。从那里,当删除一行时,您将知道它是什么节点键,并可以直接删除该节点。这避免了必须查询节点然后删除找到的节点。
-
我有点困惑,因为我一直在为整个项目使用 firebase api...不会撒谎我不敢相信创建删除功能会如此令人沮丧而且要花很多时间lul
-
这令人沮丧,因为它是如何完成的。这实际上是一个简单的过程,但该代码过于复杂;您不需要 .childAdded 甚至查询来完成这项工作。一般来说,您不必使用已知键查询节点然后转身删除它。当节点加载到您的数据源开始时,您可以跟踪它们来自 snapshot.key 的节点。当您滑动删除时,读取从滑动中获取行索引,在 dataSource 数组中查找该对象,获取节点键。然后将其从 Firebase 中移除。
标签: ios swift firebase firebase-realtime-database