如何在 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 循环问题)