【问题标题】:how to delete firebase with tableView cell SWIFT如何使用 tableView 单元格 SWIFT 删除 Firebase
【发布时间】:2020-05-05 19:46:19
【问题描述】:

您好,我正在尝试删除我使用 siwft 在 firebase 上创建的测试帖子,但我使用的代码删除了所有帖子,我只想删除 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]

 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()
}
}

【问题讨论】:

    标签: swift xcode firebase uitableview firebase-realtime-database


    【解决方案1】:

    问题中的代码实际上不会从帖子节点中删除任何内容。

    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"
    

    编辑:

    假设我想从帖子中删除 post_1 节点。这是如何完成的(还有其他方法)

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

    编辑 2:好东西

    基于 cmets,实际问题是 OP 不知道如何到达他们想要删除的特定节点。这里有两个选择

    1) 查询节点(不推荐) 使用此选项,您需要按某个值查询节点。这里的关键是值必须存在于节点中。所以在我上面的结构查询中,作者=“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)
    }
    

    所以现在每个节点的所有数据都被存储了,当需要删除时,只需从 dataSource 中读取该对象,获取 post_id 并删除

    let post = self.postArray[index of row to delete]
    let postId = post.post_id
    
    Database.database().reference().child("posts").child(postId).removeValue()
    

    【讨论】:

    • 我应该提到它们是用 childByAutoID() 排列的。如果您能看到,我已经添加了代码存储在问题信息中的方式。
    • @UsmaanMahmood 谢谢,我从结构上理解了这一点。我的回答仍然解决了核心问题,因为您尝试使用文字字符串 "uid" 的键删除节点并且该节点不存在。即使这样做(如我的回答所示),它也不会删除其他节点 - 它只会删除带有字符串键的节点:"uid"
    • 那么还有其他方法吗?
    • @UsmaanMahmood 另一种方法是什么?您正在尝试删除一个不存在的节点。如果要删除特定节点,则需要使用要删除的节点的键。我在答案中添加了一个编辑,看看。
    • 我明白你在说什么,显然输入 uid 是行不通的。我要问的是我可以使用什么代码代替 m 以便我可以为特定帖子选择由 childAutoId 创建的 id?由于您留下的内容,除非我为该帖子指定了特定的子名称,否则我将无法做到这一点。我编辑的内容是否更接近于实现我想要实现的目标?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多