Kotlin应用接入Firebase RealtimeDatabase时如何确定数据节点child路径
解决方案
1. 路径规则说明
- Firebase的
child路径完全匹配你的数据库实际结构,官方示例中的users是用户私有数据场景的示例,你不需要强行新增这类节点,按照你现有数据库结构填写即可 - 从你提供的数据库结构来看,所有服务数据存储在根节点下的
Servicios节点中,直接指向该节点即可
2. 修正Service数据类
Firebase Realtime Database 反序列化要求数据类必须有无参构造方法,给你的Service类属性添加默认值即可自动生成:
@kotlinx.serialization.Serializable data class Service( val status: String? = null, val type: String = "" ) : Serializable
3. 调整数据库读取逻辑
你当前直接监听根节点、强制转换数据的写法会出现类型异常,调整如下:
// 初始化的时候先给services赋值空列表,避免初始化适配器时空指针 services = ArrayList() // 只监听Servicios节点,不要监听整个根节点 database = FirebaseDatabase.getInstance().reference.child("Servicios") database.addValueEventListener(object : ValueEventListener { override fun onDataChange(dataSnapshot: DataSnapshot) { services.clear() // 遍历所有子节点逐个转换 for (snapshot in dataSnapshot.children) { val service = snapshot.getValue(Service::class.java) service?.let { services.add(it) } } if (services.isEmpty()) { Toast.makeText(context, "No hay ningun servicio disponible", Toast.LENGTH_LONG).show() } // 数据加载完成后通知适配器更新 adapter.notifyDataSetChanged() } override fun onCancelled(databaseError: DatabaseError) { Toast.makeText(context, "Operación cancelada", Toast.LENGTH_LONG).show() Log.w(TAG, "loadPost:onCancelled", databaseError.toException()) } })
4. 其他注意事项
- 测试阶段可以先将Firebase Realtime Database的安全规则设置为临时允许读写,避免权限拦截导致读取失败
- 如果你后续需要做用户私有服务存储,再新增
users节点按用户ID拆分数据,当前全平台公共服务的场景不需要新增该节点
内容的提问来源于stack exchange,提问作者Manuel Lucas
相关产品推荐
相关产品推荐

