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

时间:2016-11-15 14:57:41

标签: ios swift firebase firebase-realtime-database

我有UITableView,看起来像这张图片

this image

当我滑动删除记录时,我可以将其从存储它的数组中完全删除,但我在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值吗?

3 个答案:

答案 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)
    }
}