Kotlin Firebase Realtime Database动态路径读取失败问题
完全可以不硬编码用户名,动态读取对应用户的专辑数据
你现在动态拼路径读不到数据,根本不是Firebase不支持动态路径拼接,核心是你的代码存在跨类传值断点、路径拼接不严谨的问题,具体调整方法如下:
为啥你现在动态路径读不出来
你的写入和读取逻辑分属两个独立的类,写入时用到的Uname是上传页面从输入控件实时取的值,读取页面根本没拿到这个变量的实际有效值。动态拼路径的时候要么取到空字符串,要么取到的用户名和写入时的字符串大小写、空格不一致,最后拼出来的路径和数据库里实际存的节点路径对不上,自然读不到数据。硬编码能读是因为字符串完全匹配存储路径,和Firebase的路径机制没关系。
具体调整步骤
- 打通跨类的用户名传递链路
别在读取页面重新去控件上取用户名,上传页拿到合法的用户名之后,在跳转到列表页的时候直接把这个值通过Intent传过去,列表页拿到值之后再拼数据库路径,就不会出现值不匹配的问题。
参考代码:
- 上传页跳转时传值
val listPageIntent = Intent(this, AlbumListActivity::class.java) listPageIntent.putExtra("EXTRA_USER_NAME", Uname) startActivity(listPageIntent)
- 列表页接收值、拼路径
// 页面初始化时接收传递的用户名 val targetUserName = intent.getStringExtra("EXTRA_USER_NAME") // 判空避免拼出无效路径 if (targetUserName.isNullOrEmpty()) return val ref = FirebaseDatabase.getInstance().getReference("/userdata/$targetUserName")
- 把现有代码里的路径隐患修掉
就算拿到了正确的用户名,你现在写的代码有几个细节问题还是会导致路径匹配失败: - 所有路径段拼之前必须做
trim()去掉前后多余空格,避免用户输入时不小心多敲了空格,导致拼出来的路径和实际存储路径错位。比如你现在写的专辑节点路径$number _key,在数字和_key之间已经多了个无意义空格,很容易和实际存储的节点格式对不上。 - 尽量不要拿用户手动输入的用户名当永久路径段。手动输入的内容很容易因为大小写、输错字出现路径不匹配的问题,如果已经接了Firebase Auth,直接用当前登录用户的固定
uid当第一层路径的key,把结构改成/userdata/$uid/专辑节点,能彻底避免因为用户名输入不一致导致的读不到数据的问题,比手动输入的用户名稳定得多。 - 要符合Firebase Realtime Database的路径规则:路径段不支持
. # $ [ ]这类特殊字符,如果用户名里带了这些字符,直接拼路径会触发读写失败,需要提前把路径段里的特殊字符清洗掉。 - 快速排查技巧
每次拼完最终的读取路径之后,把完整的路径字符串打日志出来,和你之前查/userdata根节点时看到的实际存储路径逐字符对比,只要字符串完全一致,肯定能正常读到数据;如果读不到,百分百是拼出来的路径和实际存储路径有字符差异。
内容的提问来源于stack exchange,提问作者Njiua
相关产品推荐
相关产品推荐

