как удалить firebase с помощью tableView cell SWIFT - PullRequest
1 голос
/ 05 мая 2020

Привет, я пытаюсь удалить тестовый пост, который я сделал на firebase с помощью siwft, но код, который я использую, удаляет ВСЕ сообщения, и я хочу удалить только 1 выбранный пост. На картинке ниже я хочу удалить именно то место, на которое указывает красная стрелка.

Этот код показывает, как он хранится в Firebase.

guard let prof = uServe.currentUserProfile else {return}

    let postRef = Database.database().reference().child("posts").childByAutoId()

    let pObj = [
        "author": [

            "uid": prof.uid,
            "name": prof.name,
            "photo": prof.photo.absoluteString

              ],
      "text": textView.text,
            "timestamp": [".sv":"timestamp"]
        ] as [String:Any]

want to delete the red arrow, not the whole posts library

 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {



if editingStyle == .delete {
self.theposts.remove(at: indexPath.row)
    tableView.deleteRows(at: [indexPath], with: .left)
    Database.database().reference().child("posts").childByAutoId().removeValue()
}
}

1 Ответ

1 голос
/ 05 мая 2020

Код в вопросе фактически ничего не удалит из узла сообщений.

Database.database().reference().child("posts").child("uid").removeValue()
                                                     ^^^^^

не существует дочернего узла, у которого есть ключ буквальной строки «uid»

Если бы был дочерний узел с ключом «uid», только этот дочерний узел был бы удален. Например.

posts
   post_0
      author: "test_0"
   post_1
      author: "test_1"
   uid
      author: "test_2"
   post_2
      author: "test_3"

Если структура выглядела так и код был запущен, он удалял бы узел с ключом «uid»

posts
   post_0
      author: "test_0"
   post_1
      author: "test_1"
   post_2
      author: "test_3"

EDIT:

Предположим, я хотел удалить узел post_1 из сообщений. Вот как это будет сделано (есть и другие способы)

Database.database().reference().child("posts").child("post_1").removeValue()

EDIT 2: хорошие вещи

На основании комментариев, актуальной проблемой является OP не знает, как добраться до указанного узла c, который они хотят удалить. Вот два варианта

1) Запрос узла (не рекомендуется). С помощью этого параметра вам нужно будет запросить узел по некоторому значению. Ключевым моментом здесь является то, что значение должно существовать внутри узла. Итак, в моем запросе структуры выше для узла, где author = "test_1". Обратной стороной этого является то, что "test_1" может быть несколько авторов, поэтому эта опция имеет ограничения

2) Рекомендуется Измените модель Swift, чтобы также сохранить ключ узла. Это не указано в вопросе, но обычно tableView поддерживается источником данных, массивом, и этот массив содержит модели, которые соответствуют вашим данным Firebase.

Я обращаюсь к этому на высоком уровне с помощью псевдокода как в вопросе недостаточно кода, знайте особенности.

В этом случае это выглядит как список сообщений, поэтому модель будет

class PostClass {
   var post_id = ""
   var post_text = ""
   var author_uid = ""
   var photo_url = ""
}

, а затем массив dataSource для его хранения

var postsArray = [PostClass]()

затем, когда Firebase читается, создайте объект и сохраните ключ вместе с данными в каждом объекте.

postsNode.observe.... { snapshot in
   let post = PostClass()
   post.post_id = snapshot.key  //<-  this is the important part
   post.post_text = snapshot.childSnapshot("post_text") as? String ?? "No Text"
....
   self.postArray.append(post)
}

Итак, теперь все данные с каждого узла сохраняются, и когда он приходит время удалить, просто прочтите этот объект из источника данных, получите post_id и удалите

let post = self.postArray[index of row to delete]
let postId = post.post_id

Database.database().reference().child("posts").child(postId).removeValue()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...