我有UITableView
,看起来像这张图片
当我滑动删除记录时,我可以将其从存储它的数组中完全删除,但我在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"
如何访问创建时设置的autoId值,例如“-KWc7RTuOe5PefiMM2tL”,以便删除该子节点?
或者我可以根据登录的exerciseName
访问UserId
值吗?
答案 0 :(得分:2)
为了解决这个问题,我在最终达到预期结果之前尝试了许多不同的方法。
要删除该值,我创建了对子节点“userExercises”的引用,然后通过“运动名称”'对其进行排序。然后.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)
}
}
答案 1 :(得分:1)
这是一个相当简单的过程:
通常,tableViews的数据源是一个数组。该阵列是根据从Firebase快照读取的字典构建的 - 或者是根据快照构建的对象数组(推荐)。
所以这是一个与您的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)
你已经完成了。
答案 2 :(得分:1)
接下来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)
}
}