很快我似乎无法做到这一点。将Array或Strings放入firebase中。 (没有for循环)。我该怎么做?
代码(错误):
// Cannot convert value of type '[String]' to expected argument type '[AnyHashable : Any]
var list = [String]()
list.append("TestString")
Database.database().reference().child("TestNode").updateChildValues(list) { (error, value) in
if error != nil {
return
} else {
}
}
代码(运行然后崩溃):
// Could not cast value of type 'Swift.Array<Swift.String>' (0x103f941b8) to 'Swift.AnyHashable' (0x103f548b0).
Database.database().reference().child("TestNode").updateChildValues([list as! AnyHashable: "nil"]) { (error, value) in
if error != nil {
return
} else {
}
}
答案 0 :(得分:0)
您的代码很接近,但让我们来看看它的作用。 Firebase结构总是关键:值对(例如想想字典)所以这是有效的
name: "Leeroy"
这不是
"TestNode"
正如您所看到的,TestNode不是关键:值对。
["TestNode", "Hello", "Test123"]
也无效,因为它现在是一个字符串数组 - 而不是键:值对。
这是有效的密钥:值对
user_0
name: "Leeroy"
因为 user_0 是键和名称:&#34; Leeroy&#34; 是值,它也是键:值对。
您的代码无法正常工作,因为它尝试将单个字符串 TestNode 写入Firebase而不使用密钥:值格式。所以通过使数据成为一个键来修复它:值对(字典)而不是单个字符串(在你的情况下是一个存储在数组中的单个字符串)
let dict = [
"name": "Leeroy",
"food": "pizza"]
let testRef = self.ref.child("TestNode")
testRef.updateChildValues(dict) { (error, value) in
if error != nil {
return
} else {
}
}
这将导致以下结构写入Firebase
TestNode
name: "Leeroy",
food: "pizza"
Firebase需要知道您希望存储数据的位置;当您告诉它在 TestNode / food 节点中添加或更新 pizza 值时,它会明确知道您希望数据写入的位置。
不应该将字符串数组直接写入Firebase,因为它只是一个数组。数组的每个元素通常与节点(键)相关联,以使每个元素成为键:值对。这是一种很好的形式,使您的Firebase可查询且更易于维护。
虽然在Firebase中使用数组可能很诱人(因为可以这样做) - 不要。它不是一个在NoSQL数据库中运行良好的概念。请参阅Don't Use Arrays以及this post以及this one以供进一步阅读。
答案 1 :(得分:-1)
请检查此代码,它将起作用
let key = ref.child("posts").childByAutoId().key
let post = ["uid": userID,
"author": username,
"title": title,
"body": body]
let childUpdates = ["/posts/\(key)": post,
"/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)
作为Firebase文档Chek Update Field in firebase