我有一个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)
})
}`
答案 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()
如果您使用其他选项之一,但代码会有所不同,但概念类似,可以应用于每个选项。