如何通过文本框输入内容设置Firebase中子节点的名称?
搞定Firebase动态子节点名称的问题
嘿,我完全懂你的需求——就是想让users下面直接用输入框里的内容(比如Travis、Stephanie)当子节点的名字,而不是固定的"username"对吧?你的思路其实没大问题,只是写法上可以调整得更稳妥,还得注意几个Firebase的小坑:
正确的写法来实现你的需求
最直观也最符合Firebase使用习惯的方式,是先拿到users节点的引用,然后直接把输入的用户名作为child的参数,再设置对应的数据:
ref = Database.database().reference() // 先做个安全校验,避免空输入或者强制解包崩溃 guard let username = emailTextField.text, !username.trimmingCharacters(in: .whitespaces).isEmpty else { print("用户名不能是空的哦") return } // 直接用username当子节点名,设置数据 ref.child("users").child(username).setValue(calendar)
要是你非得用字典的方式(比如一次性批量设置多个用户),你的原写法其实是对的,但得确保username确实拿到了输入值,同时注意覆盖问题:
ref = Database.database().reference() guard let username = emailTextField.text, !username.trimmingCharacters(in: .whitespaces).isEmpty else { print("用户名不能为空") return } let userData = [username: calendar] ref.child("users").setValue(userData)
你之前可能踩的小坑
- 强制解包的风险:你用了
String(emailTextField.text!),如果输入框是空的,这会直接崩溃,所以一定要用guard let或者if let做安全校验; - 数据覆盖问题:用
setValue给users节点设字典的话,会把users下面所有原有数据都覆盖掉!如果只是想新增一个用户而不影响其他数据,换成updateChildValues就好:ref.child("users").updateChildValues(userData)
额外提醒几个细节
- Firebase的节点名称不能包含这些字符:
. # $ [ ] /,所以最好对输入的用户名做过滤,比如去掉这些非法字符; - 如果你的输入框是填邮箱的,别直接用邮箱当节点名(毕竟邮箱里有
@和.),可以提取邮箱前缀,或者做个哈希处理; - 用
child(username).setValue(...)的方式后续更灵活,比如之后要更新这个用户的某一个字段,直接再child到对应字段就行,不用动整个用户节点。
内容的提问来源于stack exchange,提问作者Theodore.K
相关产品推荐
相关产品推荐

