【问题标题】:How to put an array into Firebase Swift如何将数组放入 Firebase Swift
【发布时间】:2021-09-09 14:42:52
【问题描述】:

由于很快的原因,我似乎无法做这个简单的事情。将数组或字符串放入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 {
        }
    }

【问题讨论】:

  • 您有问题吗?
  • 不知道为什么你的代码编译得很好但是AFAIK,你应该将[AnyHashable : Any]传递给updateChildValues(_:)

标签: swift firebase firebase-realtime-database


【解决方案1】:

您的代码很接近,但让我们看看它在做什么。 Firebase 结构始终是键:值对(例如 think Dictionary),因此这是有效的

name: "Leeroy"

这不是

"TestNode"

如您所见,TestNode 不是键:值对。

["TestNode", "Hello", "Test123"]

也是无效的,因为它现在是一个字符串数组 - 不是键:值对。

这是一个有效的有效键:值对

user_0
  name: "Leeroy"

因为user_0是key,name: "Leeroy"是value,也是key:value对。

您的代码无法正常工作的原因是它试图将单个字符串 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 Arraysthis post 以及 this one 以及进一步阅读。

【讨论】:

    【解决方案2】:

    Firebase 支持键值对,因此如果您想存储一个数组,您可以为该数组分配一个键,例如

    let customArray = ["a","b","c","d"]
    myRef!.child(recordId).updateChildValues([
       Keys.shopNameKey : shopName.text!,
       "custom" : customArray
    ])
    

    问候

    【讨论】:

      【解决方案3】:

      请检查此代码,它将起作用

      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

      【讨论】:

      • 不是反对者,但您是否尝试过此代码?它将创建两个独立的节点,一个 posts/firebase_id/child 节点 和一个 user_posts/user_id/firebase_id/child 节点。那是故意的吗?它似乎与问题无关,也不清楚您为什么建议将两个单独的节点写入 Firebase。或许你可以澄清一下答案?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-14
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多