You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Firebase中新增用户保存的名言而非覆盖已有的存储数据

问题根源

  1. 你当前的保存逻辑始终写入固定路径users/{用户ID}/Quotes/quote,新写入的内容自然会覆盖旧值
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 08:36:02