【问题标题】:Retrieve child by auto id value in firebase (TableView)通过firebase(TableView)中的自动ID值检索孩子
【发布时间】:2018-01-31 13:35:06
【问题描述】:

我有一个 UI 表格视图,当我滑动单元格时,我删除了单元格,但没有删除 firebase 中的值。我到处搜索,但找不到。如何从我的火力基地的单元格中删除我刷过的阵列。下面是我如何设置我的 firebase 数据库。我要删除的数组是单元格中对应的数组,例如它可能是“-L4BMZBIcYMp_f2LDMbp”等。

还有我必须删除单元格的代码以及在哪里可以找到与单元格对应的数组

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        let fliper = self.flipList[indexPath.row]

        if let itemID = fliper.item{
            FIRDatabase.database().reference().child("Flip").child("..I need to find out how to get child auto id").removeValue(completionBlock: { (error, ref) in

                if error != nil {
                    print("Failed! to delete message")
                    return

                }
                //one way of updating the table
                self.flipList.remove(at: indexPath.row)
                self.tableViewFlips.deleteRows(at: [indexPath], with: .automatic)
            })
        }`

【问题讨论】:

  • 正如您所说,您需要在某处引用该 ID。从您的代码看起来itemID 应该是您正在寻找的内容,但这一切都取决于您如何对数据进行建模。我们不知道您的数据是什么样的,因此我们无法告诉您此自动 ID 应该来自哪里。但是一些相关的模型对象应该引用它。
  • 如果您的数据源是dictionaryNSDictionary,您只需获取字典的索引即可轻松完成此操作。我不推荐Array,尤其是当您在Firebase 调用中填充它时。

标签: ios swift firebase firebase-realtime-database tableview


【解决方案1】:

此处的“密钥”是为了确保在最初从 Firebase 加载数据时,您保持节点密钥完整。举个例子。假设您有一个包含帖子的消息传递应用程序。这是一个存储 Firebase 数据的类

struct PostStruct {
   post_key = ""
   post_text = ""
   posted_by_uid = ""
}

然后这些结构将用于填充您的数据源数组。

鉴于上述结构:

当您的 dataSource 最初是从 Firebase 填充时,当您在每个 post 节点中读取时,创建一个 post 结构,使用 Firebase 中的数据填充它并将其存储在一个 dataSource 中,通常是一个数组。

当您滑动删除时,大约有 100 个选项可用于处理实际删除过程,但这里有几个:

1) 您的 tableView 由数组支持。如果您滑动删除第 2 行(例如),检查要删除的对象(结构),从结构中捕获 post_key,然后从 Firebase 中删除节点(因为您知道节点键),然后查询该数组对象键,删除数组中的行并重新加载 tableView/更新 UI。

2) 滑动删除行时,检查对象并获取 post_key。然后从 Firebase 中移除该对象。这将触发 .childRemoved 事件(假设您已附加相应的侦听器)。当您的应用收到该事件时,确定它是哪个对象(通过键或其他方式)并将其从数组中删除并重新加载 tableView。

3) 如果滑动删除第 2 行,则从 dataSource 数组中的第 2 行获取结构,从该结构中读取键,删除第 2 行,从 Firebase 中删除对象并重新加载 tableView。

有很多很多其他方法可以解决这个问题;您的 dataSource 数组可以存储来自 firebase 的实际快照数据,也可以存储一系列键:值对,键是节点键,值是该节点内的数据(作为结构、类、字符串等)。

编辑:

一些附加信息来澄清上述内容。

假设我们使用上面的结构并且firebase有这样的匹配节点

root
  posts
    post_key_0  //created via childByAutoId
      post_text: "some post text"
      posted_by_uid: "uid_0"
    post_key_1  //created via childByAutoId
      post_text: "another post"
      posted_by_uid: "uid_1"

然后读取帖子并填充数据源数组:

struct PostStruct {
    post_key = ""
    post_text = ""
    posted_by_uid = ""
}

var dataSourceArray = [PostStruct]()

func button0() {
    let itemsRef = self.ref.child("items")
    itemsRef.observeSingleEvent(of: .value, with: { snapshot in
        for child in snapshot.children {
            let snap = child as! DataSnapshot
            let dict = snap.value as! [String: Any]
            let postKey = snap.key
            let postText = dict["post_text"] as! String
            let postedByUid = dict["posted_by_uid"] as! String
            let post = PostStruct(post_key: postKey, post_text: postText, posted_by_uid: ppostedByUid)
            self.dataSourceArray.append(post)
        }
        self.someTableView.reloadData()
    })
}

从那里开始非常简单。

假设我们使用选项 3),例如当用户滑动删除第 2 行时,您会从数组第 2 行获取该帖子

let post = self.dataSourceArray[2]
let postKey = post.post_key

现在您知道了 firebase 密钥,因此可以将其删除

let thisPostRef = fbRef.child("posts").child(postKey)
thisPostRef.remove()

最后从数组中移除并刷新tableView

self.dataSourceArray.remove(at: 2)
self.someTableView.reloadData()

如果您使用其他选项之一,代码会有所不同,但概念相似并且可以应用于每个选项。

【讨论】:

  • 假设我为一个变量分配了一个随机数,然后在数组的每个分支中都有一个,当我滑动一个单元格时,我如何获取数组内部对应的内容细胞。因此,我可以从 firebase 中删除名为“ITEMID”的子项,它会查找该值并将其删除。这行得通吗?我将如何将其放入代码中?
  • @TheLegend27 我不确定 将随机数分配给变量 是什么意思,但我认为您可能指的是使用 childByAutoId 创建的节点键(这是一个键由 Firebase 生成并保证是唯一的)。我详细概述了完成任务的一个选项。这个概念是简单地将 Firebase 节点键与数据源中的对象保持一致,这样您就可以始终在 firebase 中引用它。无论是您生成的密钥(随机?)还是 firebase 生成的密钥。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
  • 2018-01-12
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多