从 Firebase 中检索随机生成的 child ID

Retrieve randomly generated child ID from Firebase

我让 Firebase 在 Swift 应用程序中为我的记录生成随机密钥。如果我想更改特定记录,我该如何取回该密钥?在下面的示例中,我将任务标记为已完成,但是当我按下按钮时它没有按预期工作,因为我没有引用特定任务而是引用任务我需要随机生成的密钥。

 func doneHit(cell:TaskCell) {
        if let ip = tableView.indexPathForCell(cell) {
            var task = tasksInSectionArray[ip.section][ip.row]
            let tasksRef = ref.childByAppendingPath("tasks")
            ref.observeSingleEventOfType(.Value, withBlock: { snapshot in
                let doneRef = tasksRef.childByAppendingPath("\(snapshot.key)/done")
                if task.done == false {
                    task.done = true
                    cell.checkBox.image = UIImage(named: "checkedbox")
                    doneRef.setValue(task.done)
                }
                else {
                    task.done = false
                    cell.checkBox.image = UIImage(named: "uncheckedbox")
                    doneRef.setValue(task.done)
                }
                let completedByRef = tasksRef.childByAppendingPath("\(snapshot.key)/completedBy")
                if task.done == true {
                    completedByRef.setValue(self.user)
                    cell.detailLabel.text = "Completed By: \(self.user)"
                }
                else {
                    completedByRef.setValue("")
                    cell.detailLabel.text = ""
                }
                })
        }
    }

我的 Firebase 结构:

  1. 任务
    • 随机生成的ID
      • 标题:
      • 描述:
    • 随机生成的ID
      • 标题:
      • 描述:

更新 1:

我已更新我的代码以获取所有任务的 ID,但更新后端的功能无法正常工作。它只允许更新在应用程序中创建的任务。我使用网络仪表板导入了 150 个任务。那些是我无法更新的。

func doneHit(cell:TaskCell) {
        if let ip = tableView.indexPathForCell(cell) {
            var task = tasksInSectionArray[ip.section][ip.row]
            let tasksRef = ref.childByAppendingPath("tasks")
            var taskID = ""
            tasksRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
                for task in snapshot.children {
                    let _tasks = task as! FDataSnapshot
                    let id = _tasks.key
                    print(id)
                    taskID = id
                }
                let doneRef = tasksRef.childByAppendingPath("\(taskID)/done")
                if task.done == false {
                    task.done = true
                    cell.checkBox.image = UIImage(named: "checkedbox")
                    doneRef.setValue(task.done)
                }
                else {
                    task.done = false
                    cell.checkBox.image = UIImage(named: "uncheckedbox")
                    doneRef.setValue(task.done)
                }
                let completedByRef = tasksRef.childByAppendingPath("\(taskID)/completedBy")
                if task.done == true {
                    completedByRef.setValue(self.user)
                    cell.detailLabel.text = "Completed By: \(self.user)"
                }
                else {
                    completedByRef.setValue("")
                    cell.detailLabel.text = ""
                }
                })
        }
    }

要创建随机生成的密钥,您需要使用 childByAutoId()(我在您的示例代码中看不到)。
这将 return 一个您可以使用的 Firebase 参考,它将 return 密钥 .key 属性

var post1Ref = ref.childByAutoId()
post1Ref.setValue(post1)

var postId = post1Ref.key

查看文档 here

tasksRef.observeSingleEventOfType(.Value, withBlock: { snapshot in
    for task in snapshot.children {
        guard let taskSnapshot = task as? FDataSnapshot else {
            continue
        }

        let id = task.key
        // do other things
    }
}

根据蒂姆对 Swift 3 和 Firebase 4 的回答,我不得不使用下面的

for task in snapshot.children {
            guard let taskSnapshot = task as? DataSnapshot else {
                continue
            }

            let id = taskSnapshot.key

Ron 答案的替代方法是先生成密钥,然后使用它来设置值:

let autoId = databaseReference.childByAutoId().key
databaseReference.child(autoId).setValue(YOUR_VALUE)