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