【问题标题】:Adding multiple textfield to firebase using swift使用 swift 将多个文本字段添加到 firebase
【发布时间】:2017-02-23 16:55:55
【问题描述】:

我的视图控制器的图像:

这是我的代码

class AddViewController: UIViewController {

    @IBOutlet weak var questionField: UITextField!
    @IBOutlet weak var correctAnswer: UITextField!
    @IBOutlet weak var optionA: UITextField!
    @IBOutlet weak var optionB: UITextField!


    var ref: FIRDatabaseReference?


    override func viewDidLoad() {
        super.viewDidLoad()
       self.hideKeyboard()
    }

    @IBAction func createQuestion(_ sender: Any) {

         ref = FIRDatabase.database().reference(fromURL: "https://******.firebaseio.com/")
      if questionField.text != "" && correctAnswer.text != "" &&  optionA.text != "" && optionB.text != ""
      {
        self.ref?.child("Questions").setValue(["Question": questionField.text, "CorrectAnswer": correctAnswer.text, "OptionA": optionA.text, "OptionB": optionB.text])
            questionField.text = ""
            correctAnswer.text = ""
            optionA.text = ""
            optionB.text = ""
      }
        else
       {
        print("Missing fields")
        }

}
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

这是我在 Firebase JSON 中的目标:

我的代码正在运行,但它取代了 (ofc)。我的方法在保存问题方面是否正确,以便检索它会很容易?你能告诉我如何保存我的问题吗?

【问题讨论】:

    标签: ios swift firebase swift3 firebase-realtime-database


    【解决方案1】:

    首先,如果您要创建这样的数据库引用,则必须使用相当旧的 Firebase 版本。现在有一段时间(将近 6 个月?)创建对数据库的引用的正确方法是

    var ref: FIRDatabaseReference!
    
    override func viewDidLoad(){
         super.viewDidLoad()
         ref = FIRDatabase.database().reference()
    }
    

    为了使其工作,您必须为您的 firebase 项目下载 GoogleService-info.plist 文件并将其添加到您的 Xcode 项目中。


    就您的数据库结构而言...

    您的代码中的内容不会产生您在上图中的目标。您在代码中拥有的内容将产生这个......

    为了生成按您上图所示方式结构化的数据,您需要执行此操作...

    ref.child("Questions").child("Question1").setValue(["Question":questionField.text, "CorrectAnswer": correctAnswer.text, "optionA": optionA.text, "optionB": optionB.text])
    

    那么对于问题 2...

    ref.child("Questions").child("Question2").setValue(["Question":questionField.text, "CorrectAnswer": correctAnswer.text, "optionA": optionA.text, "optionB": optionB.text])
    

    然后您的 JSON 将如下所示...

    请注意,我必须将“问题”键添加为“问题 1”节点下的子值,以便将该问题的文本设置为其值。

    此外,如果您无法在 Question1 之后增加 Question2... 等等,那么您可以像这样对每个问题使用 Firebase 的方法.childByAutoId,Firebase 将自动为该节点生成一个唯一的子 ID。 ..

    ref.child("Questions").childByAutoId().setValue(["Question":questionField.text, "CorrectAnswer": correctAnswer.text, "optionA": optionA.text, "optionB": optionB.text])
    

    结果将与此类似...

    希望对您有所帮助,如果您还有其他问题,请告诉我

    【讨论】:

    • MikeG,谢谢兄弟,它按我想要的方式工作。你能帮我或分享一些代码来检索这些问题并将其放在按钮中请非常感谢你帮助我
    • @JohnDoe 很高兴我能提供帮助,请单击复选标记将答案标记为正确。我很高兴向您展示如何检索数据,但您应该为此提出另一个问题,因为它是一个不同的主题,并且可能对其他人也有帮助!
    • 这是我的问题stackoverflow.com/questions/42841730/…。希望你能解答
    【解决方案2】:

    由于setValue() 将覆盖Questions 节点的全部内容。 您应该在将问题上传到 firebase 之前创建一个孩子。

    ref.child("Questions").childByAutoId().setValue(...)
    

    【讨论】:

    • 是的,我已经知道它会覆盖。您能否详细说明您的代码如何不覆盖而不是创建另一个新问题
    • childByAutoId 会在“Questions”节点下生成一个新的子节点,当你在 childByAutoId() 之后调用 setValue 时,问题内容将存储在生成的节点下。当你上传另一个问题时,它会生成另一个新节点以防止覆盖之前的问题内容。
    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多