通过firebase中的自动id值检索子项(TableView)

时间:2018-01-31 13:35:06

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

我有一个UI表视图,当我滑动单元格时,我删除了单元格,但没有删除firebase中的值。我到处搜索但找不到它。如何从我的firebase中的单元格中删除我刷过的数组。以下是我设置firebase数据库的方法。试图删除的数组I是单元格中相应的数组,例如它可能是" -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)
            })
        }`

1 个答案:

答案 0 :(得分:1)

此处的“密钥”是为了确保在最初从Firebase加载数据时保持节点密钥不变。所以举个例子。假设你有一个有帖子的短信应用。这是一个存储Firebase数据的类

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

然后这些结构将用于填充dataSource数组。

鉴于上述结构:

当您最初从Firebase填充dataSource时,在每个帖子节点中读取时,创建一个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的实际快照数据,或者它可以存储一系列键:值对,其中键是节点键,值是该节点中的数据(作为stuct,class,string等)。 / p>

修改

其他一些信息可以澄清上述内容。

假设我们使用上面的结构,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"

然后阅读帖子并填充dataSource数组:

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

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