【问题标题】:Adding multiple children to Firebase database with Swift使用 Swift 将多个子级添加到 Firebase 数据库
【发布时间】:2017-05-11 14:28:42
【问题描述】:

我正在尝试在一个孩子中创建多个孩子。我目前可以在我的食谱中创建这个:

{
  "RecipeData": {
    "recipe": {
      "-KjTSH4uPQ152Cr-hDok": {
        "name": "Cook rice",
        "ID": "-KjTSH4uPQ152Cr-hDok",
      }
    }
  }
}

使用:

let recipe: [String : Any] = ["name" : self.recipe.name,
                              "ID" : self.recipe.key]

配方的类如下所示:

class Recipe {

    var name: String!
    var key: String

    init(from snapshot: FIRDataSnapshot) {

        let snapshotValue = snapshot.value as! [String: Any]

        self.name = snapshotValue["name"] as! String
        self.key = snapshot.key  
    }
}

但我现在想创建另一个子数组,它们将在“方法”中,看起来像这样。

{
  "RecipeData": {
    "recipe": {
      "-KjTSH4uPQ152Cr-hDok": {
        "name": "Cook rice",
        "ID": "-KjTSH4uPQ152Cr-hDok",
        "method": [
          {
            "step 1": "instruction 1"
          },
          {
            "step 2": "instruction 2"
          },
          {
            "step 3": "instruction 3"
          }
        ]
      }
    }
  }
}

编辑:

食谱是这样更新的

databaseRef.child("RecipeData").child("recipe").updateChildValues(recipe)

我看过Firebase How to update multiple children?,它是用javascript编写的,但不知道如何实现它。如果有更好的问题或示例,请随时告诉我。

【问题讨论】:

  • 显示使用完整的结构,你在其中添加了这个名字和 id 的父级
  • @NiravD 请查看我的更新结构
  • 您是否有要在其中添加此数组的配方 ID?
  • 否,配方 ID 已添加到配方中。
  • 我的意思是你怎么知道你现在需要在哪个配方中通过更新来添加这个方法,或者只有一个配方?

标签: ios swift firebase firebase-realtime-database


【解决方案1】:

您可以在一个节点内创建多个子节点,就像您对 "recipe" 节点所做的那样。例如:

{
  "RecipeData": {
    "recipe": {
      "-KjTSH4uPQ152Cr-hDok": {
        "name": "Cook rice",
        "ID": "-KjTSH4uPQ152Cr-hDok",
        "method": {
          "Step1":"instruction1",
          "Step2":"instruction2",
          "Step3":"instruction3"

        }
     }
   }
 }

这是更好的做法,因为您可以按键查找每个步骤。虽然,由于 Firebase 数据库键是按字典顺序排序的字符串,但更好的做法是在每个步骤中使用 .childByAutoId(),以确保所有步骤按顺序排列并且是唯一的。在这个例子中,我将继续使用“stepn”。

如果您在每个步骤中需要更多信息,只需将其中一个步骤键再次设为父节点:

{
  "RecipeData": {
    "recipe": {
      "-KjTSH4uPQ152Cr-hDok": {
        "name": "Cook rice",
        "ID": "-KjTSH4uPQ152Cr-hDok",
        "method": {
          "Step1": {
             "SpatulaRequired" : true,
             "Temp" : 400
          }

        }
     }
   }
 }

这可以通过在字典上调用.set() 来实现。例如:

let dict: [String:AnyObject] = ["Method":
                                ["Step1":
                                 ["SpatulaRequired":true,
                                             "temp":400],
                                ["Ste‌​p2":
                                 ["SpatulaRequire‌​d":false,
                                             "temp":500]‌​
                                ]]

myDatabaseReference.set(dict)

【讨论】:

  • 谢谢布拉德利,这更有意义,因为你提到它可以让我在未来使用密钥来引用它。但是我如何一次添加所有这些?我试图在一个动作中完成所有这些。
  • 您可以在字典词典上调用.set(),它会正常工作。例如:["Method":["Step1":["SpatulaRequired":true,"temp":400],["Step2":["SpatulaRequired":false,"temp":500]]]
  • @BradleyMackey 好的答案和几件事。请将您的评论中的代码添加到您的答案中,因为它会更容易阅读 - 还要确保它是 Swift 以匹配 OP 中的标签。此外,按照您的建议命名 method 中的节点可能是一个问题,因为 step1 之后是 step10,而不是 step2。您可能希望使用 childByAutoId 为这些节点生成父键,因为这将正确排序它们(或使用数字整数索引作为子节点(步骤:1,步骤:2,步骤:3)等)。您可能想要对这个结构进行非规范化,并且它有点深。
  • 感谢您的回答。更清楚的是,我已经能够以您提供的相同结构创建我的数据库,其中方法获取自己的唯一 ID。但是,我如何引用方法 ID。目前我只能参考配方 ID。抱歉,如果这是题外话。
  • @BradleyMackey 非常感谢您的建议,您的帮助很大!
猜你喜欢
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多