web-dev-qa-db-fra.com

Récupérer un ID enfant généré de manière aléatoire à partir de Firebase

Firebase génère des clés aléatoires pour mes enregistrements dans une application Swift. Comment puis-je récupérer cette clé si je souhaite modifier un enregistrement spécifique? Dans l'exemple ci-dessous, je marque une tâche comme étant terminée, mais lorsque je clique sur le bouton, cela ne fonctionne pas comme prévu car je ne fais pas référence à la tâche en question, mais pour référencer la tâche, j'ai besoin de la clé générée aléatoirement.

 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 = ""
                }
                })
        }
    }

Ma structure Firebase:

  1. les tâches
    • identifiant généré aléatoirement
      • titre:
      • la description:
    • identifiant généré aléatoirement
      • titre:
      • la description:

Mise à jour 1:

J'ai mis à jour mon code pour obtenir les identifiants pour toutes les tâches, mais la fonctionnalité de mise à jour du backend ne fonctionne pas correctement. Il ne fait que mettre à jour les tâches créées dans l'application. J'ai importé 150 tâches à l'aide du tableau de bord Web. Ce sont ceux que je ne parviens pas à mettre à jour.

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 = ""
                }
                })
        }
    }
7
Michael Williams
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
    }
}
5
Tim Vermeulen

Pour créer une clé générée aléatoirement, vous devez utiliser childByAutoId() (ce que je ne vois pas dans votre exemple de code).
Ceci renverra une référence Firebase que vous pourriez utiliser et qui renverra la clé avec sa propriété .key

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

var postId = post1Ref.key

Voir la documentation ici

23
Ron Harlev

Suite à la réponse de Tim pour Swift 3 et Firebase 4, je devais utiliser ce qui suit

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

            let id = taskSnapshot.key
1
ttorbik