如何在Firebase中新增用户保存的名言而非覆盖已有的存储数据
问题根源
- 你当前的保存逻辑始终写入固定路径
users/{用户ID}/Quotes/quote,新写入的内容自然会覆盖旧值 updateChildValues方法要求传入[AnyHashable: Any]类型的字典参数,你直接传入字符串会触发类型不匹配报错
解决方案
调整保存逻辑避免覆盖
Firebase Realtime Database 提供的childByAutoId()方法可自动生成全局唯一的子节点ID,给每条名言分配独立节点存储即可解决覆盖问题,修改你的saveButton代码如下:
@IBAction func saveButton(_ sender: UIButton) { // 安全校验 guard let userId = Auth.auth().currentUser?.uid, let currentQuote = quotesLabel.text, !currentQuote.isEmpty else { return } // 给每条名言生成唯一存储节点 let userQuotesRef = ref!.child("users").child(userId).child("Quotes") let singleQuoteRef = userQuotesRef.childByAutoId() // 写入单条名言 singleQuoteRef.setValue(currentQuote) }
如果后续需要扩展存储名言的附加信息(比如保存时间、作者),可以写入字典格式:
let quoteInfo: [String: Any] = [ "content": currentQuote, "savedTimestamp": ServerValue.timestamp() ] singleQuoteRef.setValue(quoteInfo)
读取已保存名言列表
后续要展示已保存列表时,直接监听对应用户的Quotes节点即可获取所有已存数据,示例逻辑:
guard let userId = Auth.auth().currentUser?.uid else { return } ref!.child("users").child(userId).child("Quotes").observe(.value) { snapshot in var savedQuotes = [String]() for child in snapshot.children { guard let childSnap = child as? DataSnapshot, let quoteContent = childSnap.value as? String else { continue } savedQuotes.append(quoteContent) } // 拿到savedQuotes数组后刷新列表UI即可 }
补充说明:如果后续需要修改某条已存名言的内容,使用
updateChildValues时必须传入字典参数,示例:// targetQuoteId为要修改的名言对应的自动生成的唯一ID ref!.child("users").child(userId).child("Quotes").child(targetQuoteId) .updateChildValues(["content": "修改后的名言内容"])
内容的提问来源于stack exchange,提问作者Logan Cohen
相关产品推荐
相关产品推荐

