如何在 firebase 中添加来自用户的数据,而不是替换已经存在的数据?

Posted

技术标签:

【中文标题】如何在 firebase 中添加来自用户的数据,而不是替换已经存在的数据?【英文标题】:How do I add data from a user in firebase rather than replace what is already there? 【发布时间】:2021-12-08 17:02:18 【问题描述】:

该应用会向用户显示随机报价。我希望用户能够保存报价并查看他们保存了哪些报价。我可以得到一个要保存的单引号,但是,只要再次单击保存按钮,它就会用新的引号覆盖以前保存的引号。我试图在其他地方找到答案,但我似乎无法让它发挥作用。以下是我当前的代码。我也尝试用 updateChildValues 替换 setValue,但出现错误无法将“String”类型的值转换为预期的参数类型“[AnyHashable:Any]”。

import UIKit
import FirebaseDatabase
import FirebaseAuth

class QuotesViewController: UIViewController 

var ref: DatabaseReference?

override func viewDidLoad() 
    super.viewDidLoad()

    ref = Database.database().reference()
    


@IBAction func backToMain(_ sender: UIButton) 
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(identifier: "mainHome")
        vc.modalPresentationStyle = .overFullScreen
        present(vc, animated: true)

@IBOutlet weak var quotesLabel: UILabel!
@IBAction func saveButton(_ sender: UIButton) 
    guard let user = Auth.auth().currentUser?.uid else  return 
    ref!.child("users").child(Auth.auth().currentUser!.uid).child("Quotes").child("quote").setValue(quotesLabel.text!)
    


@IBOutlet weak var nextButtonOutlet: UIButton!
@IBAction func nextQuoteButton(_ sender: UIButton) 
    
    let  quotesData = QuotesData()
    let randomQuote = quotesData.randomQuote()
    quotesLabel.text = randomQuote
      
  

我也试过了:

ref!.child("users").child(Auth.auth().currentUser!.uid).child("Quotes").child("quote").updateChildValues(quotesLabel.text!)

【问题讨论】:

你所说的“火力基地”是什么人?火库? Firebase 实时数据库? Firebase 云消息传递? Firebase 存储? 【参考方案1】:

这是意料之中的,你基本上是在引用同一个节点child("quote") 并试图改变它的值。但是如果你想有多个引号,你需要做的是在父child("Quotes")下创建多个不同名称的节点。

这样做的一种简单方法是,您可以为每个新报价节点附加不同的数字,例如,当您要添加新报价时,定义以下路径:

child("Quotes").child("quote1").setValue("...")

另一个引用的路径:

child("Quotes").child("quote2").setValue("...") 以此类推。

或者,您可以使用 Firebase 数据库参考方法 childByAutoId() 生成唯一名称。您将在定义父节点后使用该方法:

ref!.child("users").child(Auth.auth().currentUser!.uid).child("Quotes").childByAutoId().setValue(quotesLabel.text!)


注意:

尽量避免强制解包,因为这会使您的应用更容易崩溃。

【讨论】:

【参考方案2】:

我认为您必须在 Firebase 数据库中再添加一个字段,该字段必须是唯一的

第一次将数据添加到 Firebase 中,您可以编写类似这样的内容

 let key = ref.child("Quotes").childByAutoId().key
    let dict = ["quote": quotesLabel.text!,
                "quoteId" : key ?? ""
    ] as [String: Any]
    

每当您保存相同的报价时,您都可以像这样更新特定报价ID中的值

     func updateDatainFirebase(quoteId:String,quote:String)
        let dict = ["quote": quotesLabel.text!,
                    "quoteId" : quoteId ?? ""
        ] as [String: Any]
        self.ref.child(quoteId).updateChildValues(dict)
        
    
    

【讨论】:

谢谢!我尝试了 autoId,它工作得很好!看到这件事变得栩栩如生,真是令人兴奋! 太好了,如果您得到解决方案,您可以接受并投票赞成答案

以上是关于如何在 firebase 中添加来自用户的数据,而不是替换已经存在的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许用户只获取他们自己的数据?迅速

每次用户使用来自 firebase 的动态链接的应用程序安装我的应用程序时,我如何检测和奖励?

如何使用来自 react-redux-firebase 的 redux thunk getFireBase 和 getFirestore 将数据添加到 firebase doc

如何在数组中显示来自 Firebase 的用户昵称,然后在 TableView 中显示(For 循环问题)

来自 Firebase 的应用(Android 或 iOS)中的提醒通知

如何在 Android 中使用适配器显示来自 Firebase 的组列表?