如何从UITableViewCell使用Swift删除Firebase中的特定子节点

我有一个UITableView看起来像这个图像

这个图片

当我刷卡删除logging,我可以完全从它存储的数组中删除它,但我很难在Firebase中访问它删除它。

我的Firebase数据库结构如下图所示:

  -KWc7RTuOe5PefiMM2tL bodyPart: "Arms" exerciseName: "Test 1 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcEbpw_f6kxcePY5cO bodyPart: "Chest" exerciseName: "Test 2 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcEdUN49QaJIVf0kwO bodyPart: "Legs" exerciseName: "Test 3 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcFrMSaLKQRxghGHyT bodyPart: "Arms" exerciseName: "Test 4" userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 

我如何访问创build时设置的autoId值,例如“-KWc7RTuOe5PefiMM2tL”,以便我可以删除该子节点?

或者,也可以根据已login的UserId访问exerciseName值?

接下来从MHDev已经回答了:

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { if let exerciseName = exercises[indexPath.row].exerciseName { let ref = FIRDatabase.database().reference().child("userExercises") ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in snapshot.ref.removeValue(completionBlock: { (error, reference) in if error != nil { print("There has been an error:\(error)") } }) }) } exercises.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .left) } } 

为了解决这个问题,我最终达到了预期的效果之前,尝试了许多不同的方法。

为了删除这个值,我创build了一个对子节点“userExercises”的引用,然后通过“exerciseName”命令,然后.queryEqual(toValue :)从UITableViewCell中提取的练习名称值。

然后我删除了这个快照值,示例代码如下:

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == .delete { if let exerciseName = exercises[indexPath.row].exerciseName { let ref = FIRDatabase.database().reference().child("userExercises") ref.queryOrdered(byChild: "exerciseName").queryEqual(toValue: exerciseName).observe(.childAdded, with: { (snapshot) in snapshot.ref.removeValue(completionBlock: { (error, reference) in if error != nil { print("There has been an error:\(error)") } }) }) } exercises.remove(at: indexPath.row) tableView.deleteRows(at: [indexPath], with: .left) } } 

这是一个相当简单的过程:

一般来说,tableViews的数据源是一个数组。 该数组是从Firebase快照读取的字典或从快照构build的对象数组(build议)构build的。

因此,下面是一个与您的Firebase结构相匹配的示例(这是从快照中的单个节点填充的)

 class Exercise { key: "KWc7RTuOe5PefiMM2tL" bodyPart: "Legs" exerciseName: "Test 3 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" } 

然后,当用户滑动第3行时,从数组row3中检索Exercise对象。

 let theObject = ExerciseArray[3] let parentNode = theObject.key let ref = rootNode.child(parentNode) ref.setValue(nil) 

你完成了。