Удаление строки из таблицы и Firebase (аналогично курсу Firebase - Наше Первое Приложение)


#1

Прошел курс Firebase - Наше Первое Приложение, где описано удаление строки из таблицы с удалением соответствующей записи в Firebase, но у меня немного другая структура.

struct Records {

let title: String
let source: String
var length: String
let recordUrl: String
let username: String

init( dictionary: [String: Any]) {
    self.title = dictionary["title"] as? String ?? ""
    self.source = dictionary["source"] as? String ?? ""
    self.length = dictionary["length"] as? String ?? ""
    self.recordUrl = dictionary["recordUrl"] as? String ?? ""
    self.username = dictionary["username"] as? String ?? ""
}

}

 var records = [Records]()

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
guard let uid = Auth.auth().currentUser?.uid else { return }
if (editingStyle == .delete) {
    records.remove(at: indexPath.item)
    tableView.deleteRows(at: [indexPath], with: .fade)
    Database.database().reference().child("users").child(uid).child("records").removeValue()
}

}

Структура в Firebase
52
Подскажите как мне добраться и удалить конкретную запись в ветке records Firebase.
Тот код, который есть, удаляет всю ветку records.
Спасибо


#2

С Firebase не работал, но могу предположить что будет так

Database.database().reference().child("users").child(uid).child("records").child(recordUid).removeValue()


#3

Хорошая идея, а как получить recordUid в коде?


#4
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
guard let uid = Auth.auth().currentUser?.uid else { return }
if (editingStyle == .delete) {
    let record = records[indexPath.item]
    records.remove(at: indexPath.item)
    tableView.deleteRows(at: [indexPath], with: .fade)
    Database.database().reference().child("users").child(uid).child("records").child(record.id).removeValue()
}

#5

Уже пробовал, появляется ошибка Value of type ‘Records’ has no member ‘id’, пытался добавить в структуру Records let id: String, но не знаю как ее правильно инициализировать, никакого словаря под нее нет


#6

-LOxe5whuSxtK2iHg85J - это что за поле?


#7

Это и есть id, но код

Database.database().reference().child("users").child(uid).child("records").child(record.id).removeValue()

не работает: Value of type ‘Records’ has no member ‘id’, видимо конкретно запись child(record.id) должна выглядеть иначе


#8

Я же сказал, c Firebase не работал, поэтому весь мой код это лишь пример, т.е. вы должны его подправлять под свои нужды. Теперь ищите как вытащить ID записи.


#9

Ясно. И на этом спасибо


#10

Дошел до того, что могу получить ключи от всех records, но как добраться до конкретного, пока не очень ясно. Подскажите, кто знает

guard let uid = Auth.auth().currentUser?.uid else { return }
let ref = Database.database().reference().child("users").child(uid).child("records")
ref.observeSingleEvent(of: .value, with: { (snapshot) in

    guard let dictionaries = snapshot.value as? [String: Any] else { return }
    let record = self.records[indexPath.item]
    dictionaries.forEach({ (key, value) in
                    print("Key \(key)")

Получаю ключи в виде (не обращайте внимание на несовпадение ключей ниже и на снимке в вопросе, это уже другие записи и они совпадают с базой Firebase)
Key -LP0pW8XAZVcv9pRfcRh
Key -LP0q4LVtTgE-CxcuEiK


#11

let recordKey = Array(dictionaries.keys)[indexPath.item]


#12

Попробовал этот вариант, возвращает по количеству элементов в ветке records одно и тоже и то с неправильным id
например,
-LP0pW8XAZVcv9pRfcRh
-LP0pW8XAZVcv9pRfcRh
-LP0pW8XAZVcv9pRfcRh

  guard let uid = Auth.auth().currentUser?.uid else { return }
let ref = Database.database().reference().child("users").child(uid).child("records")
ref.observeSingleEvent(of: .value, with: { (snapshot) in
    
    guard let dictionaries = snapshot.value as? [String: Any] else { return }
    
    dictionaries.forEach({ (key, value) in
        let recordKey = Array(dictionaries.keys)[indexPath.item]
        print(recordKey)

#13

Вопрос решил:

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt 
        indexPath: IndexPath) {
    if (editingStyle == .delete) {
        guard let uid = Auth.auth().currentUser?.uid else { return }
        let record = records[indexPath.item]
        records.remove(at: indexPath.item)
        tableView.deleteRows(at: [indexPath], with: .fade)
        let recordId = record.recordId
        Database.database().reference().child("users").child(uid).child("records").child(recordId).removeValue()
      }
    
     }  

При создании записи добавил параметр recordId
let recordId = userPostRef.childByAutoId().key