iOS参考官方文档向Firebase Realtime Database追加数据未生效问题
数据无法写入的核心原因
setValue()的覆盖逻辑和你的追加预期完全不符
这个方法的特性是使用传入的参数完全替换目标节点下的所有现有内容,而非在原有数据结构上新增字段。你现在将目标路径定位到users/{当前登录用户uid}这个根级用户节点,传入的参数是纯年份数组,执行后会直接清空这个uid节点下已经存储的所有原有用户信息,根本达不到“往已有结构里追加数据”的效果。如果你的实时数据库安全规则配置了字段校验——比如要求用户节点必须存在邮箱、用户名等必填字段,这种不符合结构要求的写入请求会被规则直接拦截,整个过程没有任何弹窗或者崩溃提示,看起来就像代码完全没执行一样。- 写入路径缺失对应业务字段的层级
你没有给要存储的年份数据指定对应的键名,直接往用户根节点传入数组,就算写入成功,也会破坏原有数据库的结构约定,后续读取时根本无法定位到这个值。 - 缺少写入结果回调,无法定位具体失败原因
原生的Firebase写入操作是异步执行的,如果网络异常、权限校验不通过,没有添加完成回调的话,错误会被完全静默,你根本排查不到是哪一步出了问题。
可正常运行的修改方案
如果你的需求是在当前用户的节点下新增存储所选年份的字段,不要直接对用户根节点调用setValue(),要定位到具体的目标子路径再执行写入,同时加上错误回调定位问题:
let databaseRef = Database.database().reference() // 替换 "userSelectedYear" 为你数据库结构里实际用来存年份的字段名 databaseRef.child("users") .child(Auth.auth().currentUser!.uid) .child("userSelectedYear") .setValue(selectedYearPicker) { [weak self] error, _ in guard let self = self else { return } if let error = error { // 这里会打印所有写入失败的具体原因,比如权限不足、网络中断 print("年份数据写入失败:\(error.localizedDescription)") return } print("年份数据写入成功") }
注意:如果需要一次更新多个字段、且不覆盖节点下的其他已有数据,一定要使用
updateChildValues()代替setValue(),典型写法如下:// 定义需要更新的键值对,只替换对应键的内容,不影响其他字段 let updateFields: [String: Any] = [ "userSelectedYear": selectedYearPicker, "lastActiveTime": ServerValue.timestamp() ] databaseRef.child("users") .child(Auth.auth().currentUser!.uid) .updateChildValues(updateFields)
内容的提问来源于stack exchange,提问作者user15378633
相关产品推荐
相关产品推荐

