我花了好几个小时查看相同的问题,但我找到的答案都没有帮助解决这个问题。简单的应用程序从Firebase
数据库中检索数据,并从tableview传递到另一个视图控制器。主数据将通过,但我无法编辑信息而没有标识“密钥”,我尝试将其设置为childByAutoID()
,但随后更改为timestamp
。无论方法如何,我得到的只是条目信息而不是实际密钥本身。
func loadData() {
self.itemList.removeAll()
let ref = FIRDatabase.database().reference()
ref.child(userID!).child("MyStuff").observeSingleEvent(of: .value, with: { (snapshot) in
if let todoDict = snapshot.value as? [String:AnyObject] {
for (_,todoElement) in todoDict {
let todo = TheItems()
todo.itemName = todoElement["itemName"] as? String
todo.itemExpires = todoElement["itemExpires"] as? String
todo.itemType = todoElement["itemType"] as? String
self.itemList.append(todo)
print (snapshot.key);
}
}
self.tableView.reloadData()
}) { (error) in
print(error.localizedDescription)
}
}
答案 0 :(得分:0)
您要查找的密钥位于for循环的迭代器
中在if-let中,尝试这样做:
for (key,todoElement) in todoDict {
print(key) // this is your childByAutoId key
}
这应该可以解决问题。否则,请向我们显示数据库结构的屏幕
答案 1 :(得分:0)
如果您的数据如下所示:
var btn = document.querySelectorAll('#first> div> button');
var btn1 = document.querySelector('#first> div> button');
console.dir(btn)
console.dir(btn1)
然后我会这样查询:
Uid: {
MyStuff: {
AutoID: {
itemName: “Apocalypse”,
itemExpires: “December 21, 2012”,
itemType: “Catastrophic”
}
}
}
此外,正如我在评论中所说,如果您使用的是ref.child(userID!).child("MyStuff").observeSingleEvent(of: .value, with: { (snapshot) in
for child in snapshot.children {
let child = child as? DataSnapshot
let key = child?.key as? String
if let todoElement = child?.value as? [String: Any] {
let todo = TheItems()
todo.itemName = todoElement["itemName"] as? String
todo.itemExpires = todoElement["itemExpires"] as? String
todo.itemType = todoElement["itemType"] as? String
self.itemList.append(todo)
self.tableView.reloadData()
}
}
})
,则可以上传包含数据的密钥。示例:
.updateChildValues()
然后你可以像获得其余值一样获得密钥。所以你的新数据看起来像这样:
let key = ref.child("userID!").childByAutoId().key
let feed = ["key": key,
“itemName”: itemName] as [String: Any]
let post = ["\(key)" : feed]
ref.child("userID").child("MyStuff").updateChildValues(post) // might want a completionBlock